day24 python 主动调用其他类的成员 特殊成员: __xx__

day24 python 主动调用其他类的成员 特殊成员: __xx__
 
一.主动调用其他类的成员
    1.1.1.方式一.和继承无关的
        正常的继承是自己没有去父类找; 而现在我想要: 自己有, 执行完自己, 再去执行父类/或其他类的
        Base.f1(self)
class Base(object):
    def f1(self):
        print('base.f1, 5个功能')
class Foo(Base):
    def f1(self):
        print('foo.f1, 补充3个功能')
        Base.f1(self)                           #一个类的函数内部, 主动调用其他类的方法,但是self参数没法自己传了, 需要手动传self参数 
obj = Foo()                                     #上面传的self是什么: 是 Base()
obj.f1()
    1.1.2.总结: 
        主动调用其他类成员的方法解析,如下两种方法等价:
        方法一: 在函数内主动调用其他类的方法: Base.f1(self)
        方法二: 也可以写在类的外面:
            obj = Base()
            Base.f1(obj)
    1.2.方式二.和继承有严格的关系
        按照类的对象(seld到底是谁)的继承顺序找下一个
        super().f1()  
class Base(object):
    def f1(self):
        print('base.f1, 5个功能')
class Foo(Base):
    def f1(self):
        print('foo.f1, 3个功能')
        super().f1()                               #如何找, 有顺序的: 按照类的继承顺序找下一个     #而且有个坑, super自带self, 那么问题来了, self是谁需要考虑
class Bar(Base):
    def f1(self):
        print('bar.f1, 6个功能')
class Info(Foo, Bar):
    pass
obj = Info()
obj.f1()
 
二.面向对象中的特殊成员
    1.__init__(): 初始化方法
        #什么情况会执行此方法: 类名()
class Foo(object):
    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2
obj = Foo(1,2)
    2.__call__()
        #什么情况会执行此方法: 对象()
class Foo(object):
    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2
    def __call__(self, *args, **kwargs):
        print('bajie',args,kwargs)
obj = Foo(1,2)
obj(1,2,3,k1=456)
    3.__getitem__()
        #什么情况会执行此方法: 对象['bajie']
class Foo(object):
    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2
    def __getitem__(self, item):
        print(item)
        return 9
obj = Foo(1,2)
obj['bajie']
print(obj['bajie'])
    4.__setitem__()
        #什么情况会执行此方法: 对象['name'] = 'bajie'
class Foo(object):
    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2
    def __setitem__(self, key, value):                #这种没有返回值: rst = obj['name'] = 'bajie'
        print(key,value)                
obj = Foo(1,2)
obj['name'] = 'bajie'
    5.__delitem__()
        #什么情况会执行此方法: del 对象['uuu']
class Foo(object):
    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2
    def __delitem__(self, key):
        print(key)
obj = Foo(1,2)
del obj['uuu']
    6.__add__()
        #什么情况会执行此方法: 对象1 + 对象2
class Foo(object):
    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2
    def __add__(self, other):                          #obj1 和 obj2 按顺序传给 self 和 other
        print('666')
obj1 = Foo(1,2)
obj2 = Foo(11,22)
obj1 + obj2
    7.__enter__() 和 __exit__()
        #什么情况会执行此方法: with 对象
class Foo(object):
    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2
    def __enter__(self):                                #进入区代码
        print('666')
        return 999                                      #返回值是as后面的f
    def __exit__(self, exc_type, exc_val, exc_tb):      #退出区代码
        print('888')
obj = Foo(1,2)
 
with obj as f:
    print(f)                                            #执行区代码
    print('777')
    8.__new__(): 构造方法
        #什么情况会执行此方法: 类名()
class Foo(object):
    def __init__(self,a1,a2):                           #为空对象进行数据的初始化
        print(1)
        self.a1 = a1
        self.a2 = a2
    def __new__(cls, *args, **kwargs):
        print(2)
        return object.__new__(cls)                       #所有对象都是object创建的, python内部创建一个当前类的对象(初创的时候是空的)
                                                         #只有这个方法里有返回值的时候, init才会执行
Foo(6,6)                                                 #默认执行完new, 就停止了, init 不执行
 
 
    9.__str__()
         #什么情况会执行此方法: print(对象)       
class Foo(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return 'bajie'                                   #必须return一个字符串
obj = Foo('bajie')
print(obj,type(obj))                                     #obj默认是打印的内存地址, 如有__str__有return, 则返回对应的东西
    10.__doc__
        #print(对象.__doc__): 获取的是文档字符串
class Foo(object):
    '''
    类的注释, 表白这个类是做什么的
    '''
    def __init__(self, name):
        self.name = name
obj = Foo('bajie')
print(obj.__doc__)                                       #获取文档字符串, 简单应用
    11.__dict__
        #print(对象.__dict__): 获取的是对象里面封装的值; 很好用
class Foo(object):
    '''
    类的注释, 表白这个类是做什么的
    '''
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def func(self):
        salary = 9000
obj = Foo('bajie', 34)
print(obj.__dict__)                                      #返回一个字典: 解决的是对象里面有什么(对象里面封装了什么值); 很好用
    12.__iter__()
        #什么情况会执行此方法: for i in 循环这个对象
#lst 是列表类型的对象, 人家的这种对象可以被for循环
lst1 = [11,22,33,44]
lst2 = [1,2,3,4]
 
#我自己写的对象如何被for循环
class Foo(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def func(self):
        pass
    def __iter__(self):                                     #要有__iter__()方法
        yield self.name                                     #内部要返回一个生成器
        yield self.age
        #return  iter([6,66,666,6666])                      #或者内部要返回一个迭代器
obj = Foo('bajie',23)
 
for i in obj:
    print(i)
    13.__getattr__()
        #什么时候会被执行: 对象.xxx 的时候会被执行
class Foo:
    def __getattr__(self, item):
        return 666,item
obj = Foo()
print(obj.xxx)                                             # 参数xxx会传给 item    
 
 
 
练习:
    练习1.类或字典能否做字典的key: 可以(因为字符串就可以做key, 同时字符串也是对象)
class Foo:
    pass
aDict = {Foo:4,Foo():7}
print(aDict)
    练习2.对象中到底有什么: 有各种成员
class Foo:
    def __init__(self,age):
        self.age = age
    def display(self):
        print(self.age)
data_list = [Foo(8),Foo(9)]
for item in data_list:
    print(item.age,item.display())
    练习3
class Config(object):
    def __init__(self, num):
        self.num = num
    def change(self,request):
        print(self.num, request)
class RoleConfig(Config):
    def change(self,request):
        print('666')
config_list = [Config(1),Config(2),RoleConfig(3)]
for item in config_list:
    print(item.num)
    练习4
class Config(object):
    def __init__(self, num):
        self.num = num
    def change(self,request):
        print(self.num, request)
class RoleConfig(Config):
    pass
config_list = [Config(1),Config(2),RoleConfig(3)]
for item in config_list:
    item.change(168)
    练习5
class Config(object):
    def __init__(self, num):
        self.num = num
    def change(self,request):
        print(self.num, request)
class RoleConfig(Config):
    def change(self,request):
        print('666')
config_list = [Config(1),Config(2),RoleConfig(3)]
for item in config_list:
    item.change(168)
    练习6
class Config(object):
    def __init__(self, num):
        self.num = num
    def change(self,request):
        print(self.num, request)
    def run(self):
        self.change(999)
class RoleConfig(Config):
    def change(self,request):
        print('666',self.num)
config_list = [Config(1),Config(2),RoleConfig(3)]
config_list[1].run()
config_list[2].run()
    练习7
class Config(object):
    def __init__(self, num):
        self.num = num
    def change(self,request):
        print(self.num, request)
    def run(self):
        self.change(999)
class RoleConfig(Config):
    def change(self,request):
        print('666',self.num)
class Adminsite(object):
    def __init__(self):
        self._register = {}
    def refister(self, k, v):
        self._register[k] = v
site = Adminsite()
print(len(site._register))
site.refister('bajie', 123)
site.refister('wukong', 777)
print(len(site._register))
site.refister('datang', Config(19))
site.refister('laosha', Config(20))
site.refister('liuliu', RoleConfig(33))
print(len(site._register))
    练习8
class Config(object):
    def __init__(self, num):
        self.num = num
    def change(self,request):
        print(self.num, request)
    def run(self):
        self.change(999)
class RoleConfig(Config):
    def change(self,request):
        print('666',self.num)
class Adminsite(object):
    def __init__(self):
        self._register = {}
    def refister(self, k, v):
        self._register[k] = v
site = Adminsite()
site.refister('datang', Config(19))
site.refister('laosha', Config(20))
site.refister('liuliu', RoleConfig(33))
print(len(site._register))
for k,row in site._register.items():
    row.change(5)
    练习9
class Config(object):
    def __init__(self, num):
        self.num = num
    def change(self,request):
        print(self.num, request)
    def run(self):
        self.change(999)
class RoleConfig(Config):
    def change(self,request):
        print('666',self.num)
class Adminsite(object):
    def __init__(self):
        self._register = {}
    def refister(self, k, v):
        self._register[k] = v
site = Adminsite()
site.refister('datang', Config(19))
site.refister('laosha', Config(20))
site.refister('liuliu', RoleConfig(33))
print(len(site._register))
for k,row in site._register.items():
    row.run()
    练习10
class Userinfo(object):
    pass
class Department(object):
    pass
class Config(object):
    def __init__(self, num):
        self.num = num
    def change(self,request):
        print(self.num, request)
    def run(self):
        self.change(999)
class RoleConfig(Config):
    def change(self,request):
        print('666',self.num)
class Adminsite(object):
    def __init__(self):
        self._register = {}
    def refister(self, k, v):
        self._register[k] = v(k)
site = Adminsite()
site.refister(Userinfo, Config)
site.refister(Department, Config)
 
for k,row in site._register.items():
    row.run()
    总结:记住两点
        1.对象里封装了什么
        2.self到底是谁
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/aiaii/p/12205747.html