特殊属性和方法
一、特殊属性
__dict__:获得类对象或实例对象所绑定的所有属性和方法的字典
class A:
    pass
class B:
    pass
class C(A,B):
    def __init__(self,name,age):
        self.name=name
        self.age=age
x=C('秦健峰',23)
print(x.__dict__)#x是C的一个实例对象,可以发现其属性以字典的形式显示出来
print(C.__dict__)#显示类对象的属性和方法
print(x.__class__)#可以显示某个实例对象属于哪一个类中
print(C.__bases__)#可以显示C类的父类类型的元素
print(A.__subclasses__())#查看A的子类
运行结果:
{'name': '秦健峰', 'age': 23}
{'__module__': '__main__', '__init__': <function C.__init__ at 0x0000026449B6DCA0>, '__doc__': None}
<class '__main__.C'>
(<class '__main__.A'>, <class '__main__.B'>)
[<class '__main__.C'>]
二、特殊方法
__len__():通过重写__len__()方法,让内置函数len()的参数可以是自定义类型
__add__():通过重写__add__()方法,可使用自定义对象具有+功能
a=20
b=100
c=a+b   #两个整数相加
print(c)
d=a.__add__(b)
print(d)#可以发现,a+b其实是调用了__add__()方法
'''现在我们来试可不可以自定义对象相加
'''
class Student:
    def __init__(self,name):
        self.name=name;
    #重写add函数
    def __add__(self, other):
        return self.name+'在'+other.name
    #重写__len__函数
    def __len__(self):
        return (len(self.name))
stu1=Student('小秦同学')
stu2=Student('华中农业大学')
#如果没重写“+“方法,会出现错误:TypeError: unsupported operand type(s) for +: 'Student' and 'Student'
s=stu1+stu2
print(s)
s=stu1.__add__(stu2)
print(s)
print('-----------------------------------------------------------')
lst=[11,22,33,44,55]
print(len(lst))
#可以看到,在使用len()函数时,其实就是在调用__len__()
print(lst.__len__())
#如果没有重写__len__函数,可以发现报错:TypeError
print(len(stu1))
print(len(stu2))
运算结果:
120
120
小秦同学在华中农业大学
小秦同学在华中农业大学
-----------------------------------------------------------
5
5
4
6
Process finished with exit code 0
__new__():用于创建对象
__init__():对创建的对象进行初始化
class Person:
    def __new__(cls, *args, **kwargs):
        print('__new__被调用执行,cls的id值为{0}'.format(id(cls)))
        obj=super().__new__(cls)
        print('创建的对象的id为:{0}'.format(id(obj)))
        return obj
    def __init__(self,name,age):
        print('__init__被调用,self的id值为:'.format(id(self)))
        self.name=name
        self.age=age
print('Object这个类对象的id为:{0}'.format(id(object)))
print('Person这个类对象的id为:{0}'.format(id(Person)))
#创建Person类的实例对象
person=Person('张三',56)
print('person这个实例对象的id为:{0}'.format(id(person)))
运行结果:
Object这个类对象的id为:140703772753408
Person这个类对象的id为:1192429430288
__new__被调用执行,cls的id值为1192429430288
创建的对象的id为:1192436461328
__init__被调用,self的id值为:1192436461328
person这个实例对象的id为:1192436461328
'''
可以发现,在创建实例对象时,先调用的是new()方法,且传入new()方法的参数是Person类对象(两者id值一样)
在new()方法中通过调用父类new()方法,可以发现其所创建的实例对象就是Person创建的实例对象(两者id值一样)
'''
1、在创建实例对象时,可以发现会先将Person传入到new()方法中的cls
2、new()方法返回的obj对象然后返回给init()函数中的self
3、单init()方法执行结束后,再将self返回给person
                    
                
                
            
        
浙公网安备 33010602011771号