请教 python 中抽象类和抽象方法相关问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wisefree
V2EX    Python

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

  •  
  •   wisefree 2016-12-20 15:25:31 +08:00 2976 次点击
    这是一个创建于 3265 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    先谢过了,>_<

    15 条回复    2016-12-23 09:04:37 +08:00
    vicalloy
        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
    guyskk
        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
    Kilerd
        3
    Kilerd  
       2016-12-20 17:13:40 +08:00 via iPhone
    metaclass 又不是抽象类。抽象类在 python 里面是 abc 。

    import abc
    自己查文档怎么用。

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

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

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

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

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

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

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

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

    然后就是什么鬼编译原理什么鬼计算机网络什么鬼操作系统了
    wisefree
        15
    wisefree  
    OP
       2016-12-23 09:04:37 +08:00
    @Thoxvi 谢谢,目前正在学英语,:)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1074 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 18:02 PVG 02:02 LAX 10:02 JFK 13:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86