7-5抽象方法不加@abstractmethod也可以正常重载(python2.7.10)

来源:7-5 如何让类支持比较操作

Brook_StudyMachine

2017-01-27

from functools import total_ordering
@total_ordering
class Shape(object):
    
    def area():
        pass
    def __lt__(self,obj):
        print 'in __lt__'
        if not isinstance(obj,Shape):
            raise TypeError('obj is not Shape')
        return self.area() < obj.area()
    def __eq__(self,obj):
        print 'in __eq__'
        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
class Circle(Shape):
    def __init__(self, r):
        self.r = r
    def area(self):
        return self.r ** 2 * 3.14
r1 = Rectangle(5,3)
r2 = Rectangle(4,4)
c1 = Circle(3)
print r1 < r2 #r1.__lt__(r2)
print r1 == r2
print r1 < c1
# print r1 > 1

正常返回

True
in __eq__
False
in __lt__
True


引入ABCMeta和使用@abstractmethod是否还有必要吗?


写回答

1回答

程序员硕

2017-02-03

非抽象类可以重载, 但实例抽象类对象会报错, 非抽象类不会.可以看成错误检查.

0
1
Brook_StudyMachine
非常感谢!
2017-02-03
共1条回复

Python高效编程技巧实战

精选50个Python案例,源自实战,全面提升Python编程能力

2582 学习 · 360 问题

查看课程