乐趣区

关于python:Python类与对象的特殊方法和特殊属性

类型 名称 形容
非凡属性 __dict__ 获取类对象所有属性和办法或获取实例对象所有属性的字典
__class__ 获取实例对象的类
__bases__ 输入父类类型的元组
__base__ 输入基类,第一个继承的父类
__mro__ 类的档次后果
非凡办法 __len__() 重写此办法,让内置函数 len()的参数能够是自定义类型
__add__() 重写此办法,可应用自定义对象具备“+”性能
__new__() 创建对象
__init__() 对创立的对象进行初始化
__subclasses__() 获取子类的列表

代码示例:

class A:
    pass


class B:
    pass


class C(A):
    pass


class Human(A, B):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print('人吃各种')


x = Human('a', 22)
print(x.__dict__)  # 实例对象的属性字典;{'name': 'a', 'age': 22}
print(Human.__dict__)  # 类对象的属性和办法字典;{'__module__': '__main__', '__init__': <function Human.__init__ at 0x0000022F9EF6FEE0>, 'eat': <function Human.eat at 0x0000022F9EF6FF70>, '__doc__': None}
print(x.__class__)  # 输入对象所属的类;<class '__main__.Human'>
print(Human.__bases__)  # 输入父类类型的元组;(<class '__main__.A'>, <class '__main__.B'>)
print(Human.__base__)  # 输入基类,第一个继承的父类;<class '__main__.A'>
print(Human.__mro__)  # 类的档次后果;(<class '__main__.Human'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
print(A.__subclasses__())  # 获取子类的列表;[<class '__main__.C'>, <class '__main__.Human'>]

__add__()代替 +

a = 1
b = 2
c = a + b
d = a.__add__(b)
print(c, d)  # 3 3

自定义类型的相加,必须重写__add__()

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

    def __add__(self, other):
        return self.name + other.name


stu1 = Student('张三')
stu2 = Student('历史')

s = stu1 + stu2
print(s)  # 张三历史
# 不重写时,抛出 TypeError: unsupported operand type(s) for +: 'Student' and 'Student'

重写 __len__() 办法,自定义 __len__() 的参数及返回内容:

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

    def __len__(self):
        return self.name
        # return len(self.name)

stu1 = Student('张三')

lst = [1, 2, 3]
print(lst.__len__())  # 3
print(stu1.__len__())  # 张三
# 不重写时,抛出 AttributeError: 'Student' object has no attribute '__len__'

__init__()__new__() 的执行程序:

class Person:
    def __init__(self, name, age):
        print('执行了__init__(),self 的 id:', id(self))
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs):
        print('执行了__new__(),cls 的 id:', id(cls))
        object1 = super().__new__(cls)
        print('创建对象的 id:', id(object1))
        return object1


print('object 类对象的 id:', id(object))
print('Person 类对象的 id:', id(Person))
p1 = Person('张三', 22)  # 先执行“=”右侧的代码,再进行赋值
print('p1 实例对象的 id:', id(p1))

输入后果:

object 类对象的 id:140722564381520
Person 类对象的 id:1296646616816
执行了__new__(),cls 的 id:1296646616816
创建对象的 id:1296654563888
执行了__init__(),self 的 id:1296654563888
p1 实例对象的 id:1296654563888

论断:先创建对象,再 init 初始化。

退出移动版