特殊属性和方法

一、特殊属性

__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

 

posted @   小秦同学在上学  阅读(78)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示