特殊属性和方法
一、特殊属性
__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