特殊属性和方法

一、特殊属性

__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

 

posted @ 2021-07-09 22:03  小秦同学在上学  阅读(70)  评论(0编辑  收藏  举报