注:对象后有个. 但我不知道咋编辑才能不让它变格式
- 对象__new__: 得到对象的属性/方法构成的{字典}
- 对象__class__: 得到对象属于的类
- 对象__basses__: 得知父类(全)
- 对象__bass__: 得知继承的第一个父类
- 对象__mro__: 得到类的层次结构
- 对象__subclassses__(): 得知子类(列表)
- 对象A__add__(对象B): 相加(广义)
- 对象__len__(): 求长度
- 对象__new__(): 创建对象
- 对象__init__(): 对创建的对象初始化
- __new__是一种负责创建类实例的静态方法,它无需使用 @staticmethod 装饰器修饰
- __new__是在实例创建之前被调用的
- __new__先被调用,__init__后被调用
- __new__必须要有返回值,__new__的返回值传递给__init__的第一个参数,__init__不需要返回值
'''
对象.__dict__: 得到对象的属性/方法构成的{字典}
对象.__class__: 得到对象属于的类
对象.__basses__: 得知父类(全)
对象.__bass__: 得知继承的第一个父类
对象.__mro__: 得到类的层次结构
对象.__subclassses__(): 得知子类(列表)
对象A.__add__(对象B): 相加(广义)
对象.__len__(): 求长度
对象.__new__(): 创建对象
对象.__init__(): 对创建的对象初始化
'''
#==================== dict class basses mro subclasses
class A:
pass
class B:
pass
class C(B,A):
def __init__(self,name,age):
self.name = name
self.age = age
class D(A):
pass
stu = C('NANA',21)
print('-------------------------')
print(stu.__dict__) # {'name': 'NANA', 'age': 21}
print(C.__dict__) # {'__module__': '__main__', '__init__': <function C.__init__ at 0x0000023B5519FE58>, '__doc__': None}
print('-------------------------')
print(stu.__class__) # <class '__main__.C'>
print(C.__class__) # <class 'type'>
print('-------------------------')
print(C.__bases__) # (<class '__main__.B'>, <class '__main__.A'>)
print(C.__base__) # <class '__main__.B'>
print('-------------------------')
print(C.__mro__) # (<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
print('-------------------------')
print(A.__subclasses__()) # [<class '__main__.C'>, <class '__main__.D'>]
#==================== add len
# 参考原理:
a = 10
b = 3
c = a+b
d = a.__add__(b)
print(c) # 13
print(d) # 13
lst = [1,3,6,7]
print(len(lst)) # 4
print(lst.__len__()) # 4
class Student:
def __init__(self,name):
self.name = name
def __add__(self,other):
return self.name + other.name
def __len__(self):
return len(self.name)
stu1 = Student('NANA')
stu2 = Student('娜娜')
s = stu1 + stu2 # 注:if没在Student类里定义__add__方法,则执行不了stu1+stu2
print(s) # NANA娜娜
print(stu1.__add__(stu2)) # NANA娜娜
length = len(stu1) # 注:if没在Student类里定义__len__方法,则执行不了len(stu1)
print(length) # 4
print(stu1.__len__()) # 4
'''__new__() 是一种负责创建类实例的静态方法,它无需使用 @staticmethod 装饰器修饰
__new__是在实例创建之前被调用的
_new__先被调用,__init__后被调用
__new__必须要有返回值,__new__的返回值传递给__init__的第一个参数,__init__不需要返回值
注意代码执行顺序
'''
#==================== new init
class Person(object):
def __init__(self,name,age): # 5th
print('__init__()被调用,self的id为:{0}'.format(id(self))) # 9512
self.name = name
self.age = age
def __new__(cls,*args,**kwargs): # 4th
print('__new__()被调用,cls的id为{0}'.format(id(cls))) # 0776
obj = super().__new__(cls) # 重写父类object的new
print('创建的对象的id为:{0}'.format(id(obj))) # 9512
return obj
print('类对象object的id为:{0}'.format(id(object))) # 3648 1st
print('类对象Person的id为:{0}'.format(id(Person))) # 0776 2nd
# 创建实例对象
p1 = Person('娜娜',21) # 3rd
print('实例对象p1的id为:{0}'.format(id(p1))) # 9512 6th