最近学习 python ,被各种实例方法,类方法,静态方法,抽象方法弄的有点懵。这么多方法各自的应用场景是什么呢?
一个抽象类中(metaclass=ABCMeta),所有的方法是否必须为抽象方法呢?看了帮助文档和网上的一些资料没怎么弄明白
先谢过了,>_<
1
vicalloy 2016-12-20 15:38:19 +08:00 1
不知道 “抽象类” 这个名字从哪里听来的,似乎没听过这个叫法,而且这个叫法不但不形象还很误导。
metaclass 有点黑魔法的味道,知道 metaclass 做什么的,能看到 metaclass 的代码就可以。实际应用中自己写 metaclass 实现的机会非常少(你可以简单的认为用不到)。 metaclass 简单的说就是以一个类为模板,生成一个全新的类。 实在想详细了解还是老老实实的看文档 http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python |
2
guyskk 2016-12-20 17:13:05 +08:00
A class that has a metaclass derived from ABCMeta cannot be instantiated unless all of its abstract methods and properties are overridden.
https://docs.python.org/3/library/abc.html#abc.abstractmethod |
3
Kilerd 2016-12-20 17:13:40 +08:00 via iPhone
metaclass 又不是抽象类。抽象类在 python 里面是 abc 。
import abc 自己查文档怎么用。 不理解什么是抽象类,什么是类方法什么的,不是 python 的问题,是你理论不行,无关乎语言问题。 至于 metaclass 是什么,我也不知道怎么说,百度去吧。别人的教程总会比我讲得好。 |
4
practicer 2016-12-20 17:13:45 +08:00 1
我在 python cookbook 一书了解的抽象类, 它用来继承使用, 不能直接实例化, collections.defaultDict, collections.OrderedDict, collections.Counter 等, 都是抽象类, 继承后就拥有它们的特性了,, 优点 重用代码
|
5
wisefree OP @practicer 嗯,我也看了这本书,文档中有这样一段话:
@abc.abstractmethod A decorator indicating abstract methods. Using this decorator requires that the class ’ s metaclass is ABCMeta or is derived from it. 但是如下代码运行没有问题: ```python from abc import ABCMeta, abstractmethod class Shape(object): @abstractmethod def area(self): pass def __lt__(self, obj): return self.area() < obj.area() def __eq__(self, obj): return self.area() == obj.area() class Rectangle(Shape): def __init__(self, w, h): self.w = w self.h = h def area(self): return self.w * self.h if __name__ == "__main__": r1 = Rectangle(2, 3) r2 = Rectangle(2, 4) print(r1 < r2) ``` 如下代码也没有问题 ``` python from abc import ABCMeta, abstractmethod class Shape(metaclass=ABCMeta): @abstractmethod def area(self): pass def __lt__(self, obj): return self.area() < obj.area() def __eq__(self, obj): return self.area() == obj.area() class Rectangle(Shape): def __init__(self, w, h): self.w = w self.h = h def area(self): return self.w * self.h if __name__ == "__main__": r1 = Rectangle(2, 3) r2 = Rectangle(2, 4) print(r1 < r2) ``` |
6
dtfm 2016-12-20 21:21:19 +08:00
应该是想问类方法( classmethod )/静态方法( staticmethod )/实例方法吧
|
8
Thoxvi 2016-12-21 10:08:02 +08:00 via Android 1
和 Java 的接口和 c 艹的纯虚函数一样…楼主可以面向对象的编程范式
|
10
Thoxvi 2016-12-21 23:39:23 +08:00 via Android 1
|
12
Thoxvi 2016-12-22 14:25:51 +08:00 via Android
|
13
wisefree OP @Thoxvi 嗯嗯,越学越觉得不容易,并不是像想象的那么简单。现在还没有想去学好计算机科学(也不知道计算机科学有多广泛),现在暂时想学好 python ,满足行业要求而已。
|
14
Thoxvi 2016-12-22 22:38:13 +08:00 via Android 1
|