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 · 2659 次点击
    这是一个创建于 2899 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近学习 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   ·   实用小工具   ·   3275 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:21 · PVG 20:21 · LAX 04:21 · JFK 07:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.