类的知识6|特殊属性与方法

名称描述
特殊属性__dict__获得类对象/实例对象所绑定的所有属性和方法的字典
__class__输出对象所属的类
__bases__输出类所属的父类
__mro__查看类的层次结构
__subclasses__查看类的子类
特殊方法__len__()重写此方法,可以让内置函数len()的参数是自定义类型
__add__()重写此方法,可以使用自定义对象具有+的功能
__new__()用于创建对象
__init__()对创建对象初始化

__dict__属性

class A:
    pass
class B:
    pass
class C(A,B):
    def __init__(self,name):
        self.name=name

"""实例对象用dict方法,得到绑定属性与对应属性值的字典"""
x=C('Alice')
print(x.__dict__)

"""类对象用dict方法,得到属性与方法的字典"""
print(C.__dict__)

结果得到一个键为绑定属性,值为对应属性值的字典

{'name': 'Alice'}

{'__module__': '__main__', '__init__': <function C.__init__ at 0x000000C6E4D55000>, '__doc__': None}

__class__属性

"""指向实例对象所属的类"""
print(x.__class__)

"""对类使用此函数会显示类的类型"""
print(C.__class__)

"""可以进行套用"""
print(x.__class__.__class__)

 结果如下:

<class '__main__.C'>
<class 'type'>
<class 'type'>

 __bases__/__base__

print(C.__bases__)
"""结果为(<class '__main__.A'>, <class '__main__.B'>)"""

print(C.__base__)
"""结果为(<class '__main__.A'>"""

__mro__ and __subclasses__

"""查看类的层级关系,不清楚类之间关系时可以使用这个属性"""
print(C.__mro__)
"""(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)"""

"""查看类的子类,使用复数以防多个子类"""
print(A.__subclasses__())
"""(<class '__main__.C'>"""

特殊方法

__len__()

比如创建一个实例对象,如果想要得到这个实例对象实例属性的长度,会报错,如图:

class C():
    def __init__(self,name):
        self.name=name

x=C('Alice')
print(len((x))
"""结果为:TypeError: object of type 'C' has no len()"""

如果想要实现这个功能,需要改写方法

class C():
    def __init__(self,name):
        self.name=name
"""改写len()方法"""
    def __len__(self):
        return len(self.name)

x=C('Alice')
print(len((x))
"""结果为:5"""

__add__()

一般情况下,我们想让两个实例对象字符串的部分相加,会报错


class C():
    def __init__(self,name,age):
        self.name=name
        self.age=age

a=C('lily',20)
b=C('Jim',23)
c=a+b
print(c)
"""报错,TypeError: unsupported operand type(s) for +: 'C' and 'C'"""

如果想要实现这一功能,我们需要在类里进行改写__add__方法

class C():
    def __init__(self,name,age):
        self.name=name
        self.age=age
"""重写__add__方法"""
    def __add__(self, other):
        return self.name+other.name

a=C('lily',20)
b=C('Jim',23)
c=a+b
print(c)
"""结果为:lilyJim"""

__new__方法和__init__方法的区别,有一篇文章讲的好清楚,留存

Python 中的__new__和__init__的区别 - CuriousZero - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值