Python面向对象编程(三)
第29,33个:类成员之特殊成员
29:
1 class foo: 2 3 #def __init__(self,name): 4 #self.name = name 5 6 def __init__(self): #构造方法 7 print("init") 8 def __del__(self): #析构方法,自动执行 9 pass 10 11 def __call__(self, *args, **kwargs): 12 print("call") 13 14 15 obj = foo() #创建对象执行init方法 16 obj() #对象加括号执行call方法 17 18 ret = obj.__class__ #运行的类名赋值给ret 19 #print(ret)
1 class foo: 2 3 def __init__(self,name,age): 4 self.name = name 5 self.age = age 6 7 def __str__(self): #特殊成员__str__ 8 return "%s + %s" %(self.name,self.age) 9 obj1 = foo("kai",23) 10 obj = foo("han",24) 11 print(obj) 12 print(obj1)
30:
1 class foo: 2 def __init__(self,name,age): 3 self.name = name 4 self.age = age 5 6 obj = foo("han",19) 7 ret = obj.__dict__ #获取对象中封装的所有数据 8 print(ret) 9 #输出的是:{'age': 19, 'name': 'han'} 10 11 print(foo.__dict__) #获取类中封装的所有数据
32:
1 class foo: 2 #如果有两个getitem执行后一个 3 def __getitem__(self, item): 4 print(item.start) 5 print(item.stop) 6 print(item.step) 7 8 def __getitem__(self, item): #运行的ret和rets 9 print(type(item)) 10 11 def __setitem__(self, key, value): #key=[1:4] value=[22,33,55,66,77] 12 print(type(key),type(value)) 13 14 def __delitem__(self, key): 15 pass 16 17 obj = foo() #创建对象 18 ret = obj[1:9:5] #切片 19 rets = obj["hk"] 20 21 obj[1:4] = [22,33,55,66,77]
33:
1 class foo: 2 def __iter__(self): #iter迭代方法 3 yield 1 4 yield 2 5 6 obj = foo() 7 for item in obj: #obj调用函数方法里的iter 8 print(item)
第35个:其他之isinstance和issubclass
1 class bar: 2 pass 3 4 class foo(bar): 5 pass 6 obj = foo() 7 ret = isinstance(obj,foo) #查看obj对象是不是foo的实例 8 ret1 = isinstance(obj,bar) #查看obj对象是不是 foo的父类bar的实例 9 print(ret) 10 print(ret1) 11 12 rets = issubclass(foo,bar) #foo是不是bar的子类,如果是子类返回true,如果不是返回false 13 print(rets)
重要:
!!!在不修改源代码的前提下,通过继承的方式实现功能
1 class c1: 2 def f1(self): 3 print("c1.f1") 4 5 class c2(c1): 6 def f1(self): 7 #主动执行父类的f1方法 8 super(c2,self).f1() 9 #c1.f1(self)主动执行父类的另一种形式,知道就好不建议使用 10 print("c2.f1") 11 12 obj = c2() 13 obj.f1() 14 15 ''' 16 输入结果: 17 c1.f1 18 c2.f1 19 '''
第39个:单例模式
1 class foo: 2 3 instance = None #静态字段由类访问 4 5 def __init__(self,name): 6 self.name = name 7 8 @classmethod #类方法 9 def get_instance(cls): #类名 10 if cls.instance: 11 return cls.instance 12 else: 13 obj = cls("han") 14 cls.instance = obj 15 return obj 16 17 obj = foo.get_instance() 18 obj1 = foo.get_instance()