Python面向对象之六:类的约束和super函数
一、类的约束
类的约束就是对父类对子类的属性和方法进行一定的约束控制。
1、对子类属性的约束(slots)
class A:
__slots__ = ['a', 'b']
pass
class B(A):
pass
a1 = A()
a1.a = 10
print(a1.a)
a1.c = 1000#AttributeError:'A' object has no attribute 'c'
b = B()
b.c = 100
print(b.c)#100
分析:
1、__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的。
2、__slots__可以防止创建__slots__之外的新属性,如上例__slots__只包含a、b属性,创建别的就报错。
class ParentA(object):
__slots__ = "x",
class ParentB(object):
__slots__ = "y",
class Child(ParentA, ParentB):
pass
分析:在多继承内,两个父类都定义了 slots ,那么程序会报错
综上:__slots__虽然能对属性的创建有约束,但是其在属性约束方面的缺陷也很大,所以不应当把防止创造__slots__之外的新属性作为使用__slots__的原因,应该使用decorators以及getters,setters来实现类属性的约束控制(上篇文章已学习过此方式)。
2、对子类方法的约束
2.1自定义方式
class Base(object):
def send(self):
raise NotImplementedError('子类中必须实现send方法')
class Foo(Base):
"""如果不写send方法,会返回错误信息"""
def send(self):
print('234')
obj = Foo()
obj.send()#NotImplementedError: 子类中必须实现send方法
2.2第三方组件方式
import abc
class Base(metaclass=abc.ABCMeta):
"""抽象类"""
@abc.abstractmethod # 抽象方法,继承这个类的时候必须实现这个方法
def send(self):
pass
def func(self):
print(123)
class Foo(Base):
pass
obj = Foo()
#TypeError: Can't instantiate abstract class Foo with abstract methods send
3、为什么要进行类的约束
一个简单的例子:
第一版:实现王者荣耀英雄亚瑟和鲁班的普通攻击功能
class</