请教 python 中抽象类和抽象方法相关问题

2016-12-20 15:25:31 +08:00
 wisefree

最近学习 python ,被各种实例方法,类方法,静态方法,抽象方法弄的有点懵。这么多方法各自的应用场景是什么呢?

一个抽象类中(metaclass=ABCMeta),所有的方法是否必须为抽象方法呢?看了帮助文档和网上的一些资料没怎么弄明白

先谢过了,>_<

2527 次点击
所在节点    Python
15 条回复
vicalloy
2016-12-20 15:38:19 +08:00
不知道 “抽象类” 这个名字从哪里听来的,似乎没听过这个叫法,而且这个叫法不但不形象还很误导。
metaclass 有点黑魔法的味道,知道 metaclass 做什么的,能看到 metaclass 的代码就可以。实际应用中自己写 metaclass 实现的机会非常少(你可以简单的认为用不到)。

metaclass 简单的说就是以一个类为模板,生成一个全新的类。
实在想详细了解还是老老实实的看文档
http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python
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
Kilerd
2016-12-20 17:13:40 +08:00
metaclass 又不是抽象类。抽象类在 python 里面是 abc 。

import abc
自己查文档怎么用。

不理解什么是抽象类,什么是类方法什么的,不是 python 的问题,是你理论不行,无关乎语言问题。

至于 metaclass 是什么,我也不知道怎么说,百度去吧。别人的教程总会比我讲得好。
practicer
2016-12-20 17:13:45 +08:00
我在 python cookbook 一书了解的抽象类, 它用来继承使用, 不能直接实例化, collections.defaultDict, collections.OrderedDict, collections.Counter 等, 都是抽象类, 继承后就拥有它们的特性了,, 优点 重用代码
wisefree
2016-12-20 18:10:21 +08:00
@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)
```
dtfm
2016-12-20 21:21:19 +08:00
应该是想问类方法( classmethod )/静态方法( staticmethod )/实例方法吧
wisefree
2016-12-21 08:06:10 +08:00
@dtfm 不是,是 ABCMeta 和 abstractmethod
Thoxvi
2016-12-21 10:08:02 +08:00
和 Java 的接口和 c 艹的纯虚函数一样…楼主可以面向对象的编程范式
wisefree
2016-12-21 21:45:04 +08:00
@Thoxvi 嗯,谢谢指教!目前只是学了 python ,对你说的不大懂,有资料推荐么?
Thoxvi
2016-12-21 23:39:23 +08:00
@wisefree

不用急,慢慢学 Python
也可以试试学学 Java
Java 相对 Python 来说更加面向对象

楼主是大学?
wisefree
2016-12-22 08:04:56 +08:00
@Thoxvi 读研中,只不过不是计算机专业的,想转行~_~
Thoxvi
2016-12-22 14:25:51 +08:00
@wisefree

学学写代码倒是不难,
但是要学好计算机科学还是挺麻烦的。

我也不知道楼主什么专业…所以不做评论…
wisefree
2016-12-22 16:32:08 +08:00
@Thoxvi 嗯嗯,越学越觉得不容易,并不是像想象的那么简单。现在还没有想去学好计算机科学(也不知道计算机科学有多广泛),现在暂时想学好 python ,满足行业要求而已。
Thoxvi
2016-12-22 22:38:13 +08:00
@wisefree

话说要是真的需要建议的话,
强烈建议楼主把英语数学学好…

英语查资料看文档看 GitHub
数学写算法写数据结构

然后就是什么鬼编译原理什么鬼计算机网络什么鬼操作系统了
wisefree
2016-12-23 09:04:37 +08:00
@Thoxvi 谢谢,目前正在学英语,:)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/328903

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX