1)特殊属性
#1)特殊属性
print(dir(object)) #查看对象具备哪些属性和方法dir()
class A:
pass
class B:
pass
class C(A,B):
def __init__(self,name,age):
self.name=name
self.age=age
class D(A):
pass
#创建c类对象
a=C('jack',20) #a是C类型的一个是咧属性
print(a.__dict__) #实例对象的属性 字典 {'name': 'jack', 'age': 20}
print(C.__dict__) #{'__module__': '__main__', '__init__': <function C.__init__ at 0x00000161D08CD4C0>, '__doc__': None}
#实例对象输出的是属性字典。类对象输出的是属性以及方法字典。
#方法是在类对象当中的,实例对象只能负责调用
print(a.__class__) #输出对象所属的类 <class '__main__.C'>
print(C.__bases__) #输出的父类类型的元组(<class '__main__.A'>, <class '__main__.B'>)
print(C.__base__) #类的基类,谁挨在前面就输出谁 <class '__main__.A'>
print(C.__mro__) #类的层次结构
print(A.__subclasses__()) #子类的列表 [<class '__main__.C'>, <class '__main__.D'>]
2)特殊方法
__add__()
#2)特殊方法
#例1 __add__()
a=20
b=100
c=a+b #两个整数类型的对象的相加操作
d=a.__add__(b)
print(c)
print(d)
#例2
class Student:
def __init__(self,name):
self.name=name
def __add__(self, other):
return self.name+other.name
stu1=Student('张三')
stu2=Student('李四')
s=stu1+stu2 #实现了两个对象的加法运算(因为在student中编写了__add__()特殊方法)
print(s) #张三李四
#以下书写方式输出结果同上
s=stu1.__add__(stu2)
print(s) #张三李四
__len_()
class Student:
def __init__(self,name):
self.name=name
def __len__(self):
return len(self.name)
stu1=Student('jack')
print(len(stu1)) #4
#__len__
lst=[11,22,33]
print(len(lst)) #3 len()是内置函数
print(lst.__len__()) #3 特殊方法
__new__
#__new__() 创建对象
class Person(object):
def __new__(cls, *args, **kwargs):
print('__new__被调用执行了,cls的id值为{0}'.format(id(cls))) #__new__被调用执行了,cls的id值为2005719952352
obj=super().__new__(cls) #调用父类person中__new__()方法,赋值给obj
print('创建的对象id为{0}'.format(id(obj))) #创建的对象id为2005721087760
return obj
def __init__(self,name,age):
print('__init__被调用了,self的id值为{0}'.format(id(self))) #__init__被调用了,self的id值为2005721087760
self.name=name
self.age=age
print('object这个类对象的id值为:{0}'.format(id(object))) #object这个类对象的id值为:140706624753152
print('Person这个类对象的id值为:{0}'.format(id(Person))) #Person这个类对象的id值为:2005719952352
#创建Person类的实例对象
p1=Person('张三',20) #先执行=右边的代码
print('p1这个Person类的实例对象的id:{0}'.format(id(p1))) #p1这个Person类的实例对象的id:2005721087760
__new__()在前,去创建对象.__init__()在后,为这个对象的实例对象进行赋值,最后将创建的对象放到p1当中进行存储.
执行顺序关系图:
1)先将Person传给__new__()方法中的cls 2)将cls传给objec的__new__里创建了对象obj 3)将创建的对象obj赋值返回给self 4)对象创建完成并且初始化完毕,将self赋值给到p1