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到底是谁