python 特殊方法、特殊属性

注:对象后有个. 但我不知道咋编辑才能不让它变格式

  • 对象__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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值