Python高级 - 类

Python高级 - 类

1. super()

super(cls, instance)返回的对象支持在基类上执行属性查找。如果使用该函数,Python将使用基类上的搜索规则类搜索属性。Python3中使用super()

2. 多重继承搜索的顺序

  • 基类顺序由C3线性优化算法决定,算法论文:《A Monotonic Superclass Linearization for Dylan》(K. Barrent等,OOPSLA’96)
  • 某些类层次结构将被Python拒绝并抛出TypeError。示例代码如下:
class A: pass
class B(A): pass
class C(A, B): pass
  • 通过ClassName.__mro__查看基类顺序

3. 私有类型实现

类中所有以双下划线开头的名称(如__foo)会自动变形为_ClassName__foo形式的名称,以防止继承后属性或方法产生冲突

4. __new__()

  • 原型:__new__(cls, *args, **kwargs), 返回一个实例

  • 创建类的实例时,会先调用__new__()创建新实例,然后使用__init__()初始化实例。操作f = Foo(2)时会执行:

f = Foo.__new__(Foo, 2)
if isinstance(f, Foo):
    Foo.__init__(f, 2)
  • 用途:
    • 继承的基类是不可变的如str
    • 定义元类
class UpperStr(str):
    def __new__(cls, value=""):
        return str.__new__(cls, value.upper())

5. __del__()

当程序的引用计数变为0时会调用__del__(), 但是del语句不会直接调用__del__()方法。

风险定义了__del__()的实例无法被Python的循环垃圾回收器回收

6. 抽象基类

from abc import ABCMeta, abstractclassmethod, abstractproperty

class A(metaclass=ABCMeta):

    @abstractclassmethod
    def haha(self):
        pass

    @abstractproperty
    def name(self):
        pass

class A(metaclass=ABCMeta):定义A是一个抽象基类,继承自抽象基类的类必须实现@abstractclassmethod@abstractproperty所装饰的内容。

  • @abstractclassmethod 定义了子类必须实现的方法
  • @abstractproperty定义了子类必须实现的property属性

7. 元类

元类用于显著的更改用户定义类的行为和属性。python3中默认的元类是type(),python2中默认的元类是types.ClassType即旧式类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值