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__': , 'eat': , '__doc__': None}
print(x.__class__)  # 输出对象所属的类;
print(Human.__bases__)  # 输出父类类型的元组; (, )
print(Human.__base__)  # 输出基类,第一个继承的父类;
print(Human.__mro__)  # 类的层次结果;(, , , )
print(A.__subclasses__())  # 获取子类的列表;[, ]

__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初始化。

你可能感兴趣的:(python)