特殊属性和方法
一、特殊属性
__dict__:获得类对象或实例对象所绑定的所有属性和方法的字典
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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__()方法,可使用自定义对象具有+功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | 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__():对创建的对象进行初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)