其他分享
首页 > 其他分享> > 面向对象高级

面向对象高级

作者:互联网

目录

1. isinstance,issubclass

1.1 isinstance与type

type是用来判断类型的,但是不会认为子类是父类的一种类型

isinstance也是用来判断对象类型,但是会认为子类是父类的一种类型

class A:
    pass

class B(A):
    pass

class C(B):
    pass

c = C()

print(type(c) == C)
print(type(c) == A)  # 不能找到父类
print('*'*50)
print(isinstance(c,C))
print(isinstance(c,A))   # 能找到父类
True
False
**************************************************
True
True

1.2 issubclass

判断是否是子类的

class A:
    pass

class B(A):
    pass

class C(B):
    pass


print(issubclass(C,A))
True

2. 反射

class People():
    country = 'china'
    
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    def eat(self):
        print(f'{self.name} is eating')
        
peo = People('hades',27)
print(hasattr(peo,'eat'))
True
print(getattr(peo,'eat'))
getattr(peo,'eat')()
<bound method People.eat of <__main__.People object at 0x000002813096B710>>
hades is eating
print(peo.__dict__)
setattr(peo,'weight',120)
print(peo.__dict__)
{'name': 'hades', 'age': 27}
{'name': 'hades', 'age': 27, 'weight': 120}
delattr(peo,'age')
print(peo.__dict__)
{'name': 'hades', 'weight': 120}

3. __init__,__new__

我们首先得从__new__(cls[,...])的参数说说起,__new__方法的第一个参数是这个类,而其余的参数会在调用成功后全部传递给__init__方法初始化

所以,__new__方法(第一个执行)先于__init__方法执行:

class A:
    def __new__(cls):
        print('__new__被触发了')
        obj = object.__new__(cls)
        return obj   # 必须返回
        
    def __init__(self):
        print('__init__被触发了')
        
a = A()
__new__被触发了
__init__被触发了

4. __call__

对象后面加括号时,就会触发__call__方法

class People():
    country = 'china'
    
    def __init__(self):
        print('__init__被触发了')
        
    def __call__(self):
        print('__call__被触发了')
p = People()
__init__被触发了
p()
__call__被触发了

标签:__,高级,面向对象,init,peo,print,new,class
来源: https://www.cnblogs.com/Hades123/p/11068324.html