Python面向对象之六:类的约束和super函数

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</
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值