二,面相对象的特殊成员及相关内置函数
2.1 isinstance与issubclass
isinstance(obj,cls)检查是否obj是否是类 cls 的对象
1 class A: pass 2 3 class B(A): pass 4 5 abj = B() 6 print(isinstance(abj,B)) #True 7 print(isinstance(abj,A)) #True 8 9 示例
issubclass(sub, super)检查sub类是否是 super 类的派生类
1 class A: pass 2 3 class B(A): pass 4 5 abj = B() 6 7 print(issubclass(B,A)) #True 8 9 示例
2.2 反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个可以实现自省的函数
下列方法适用于类和对象(一切皆对象,类本身也是一个对象)
1 class Foo: 2 f = '类的静态变量' 3 def __init__(self,name,age): 4 self.name=name 5 self.age=age 6 7 def say_hi(self): 8 print('hi,%s'%self.name) 9 10 obj=Foo('egon',73) 11 12 #检测是否含有某属性 13 print(hasattr(obj,'name')) 14 print(hasattr(obj,'say_hi')) 15 16 #获取属性 17 n=getattr(obj,'name') 18 print(n) 19 func=getattr(obj,'say_hi') 20 func() 21 22 print(getattr(obj,'aaaaaaaa','不存在啊')) #报错 23 24 #设置属性 25 setattr(obj,'sb',True) 26 setattr(obj,'show_name',lambda self:self.name+'sb') 27 print(obj.__dict__) 28 print(obj.show_name(obj)) 29 30 #删除属性 31 delattr(obj,'age') 32 delattr(obj,'show_name') 33 delattr(obj,'show_name111')#不存在,则报错 34 35 print(obj.__dict__) 36 37 对实例化对象的示例
1 复制代码 2 class Foo(object): 3 4 staticField = "old boy" 5 6 def __init__(self): 7 self.name = 'wupeiqi' 8 9 def func(self): 10 return 'func' 11 12 @staticmethod 13 def bar(): 14 return 'bar' 15 16 print getattr(Foo, 'staticField') 17 print getattr(Foo, 'func') 18 print getattr(Foo, 'bar') 19 20 对类的示例
1 import sys 2 3 4 def s1(): 5 print 's1' 6 7 8 def s2(): 9 print 's2' 10 11 12 this_module = sys.modules[__name__] 13 14 hasattr(this_module, 's1') 15 getattr(this_module, 's2') 16 17 对当前模块的示例
1 #一个模块中的代码 2 def test(): 3 print('from the test') 4 """ 5 程序目录: 6 module_test.py 7 index.py 8 9 当前文件: 10 index.py 11 """ 12 # 另一个模块中的代码 13 import module_test as obj 14 15 #obj.test() 16 17 print(hasattr(obj,'test')) 18 19 getattr(obj,'test')() 20 21 其他模块的示例
2.3 __len__
1 class A: 2 def __init__(self): 3 self.a = 1 4 self.b = 2 5 6 def __len__(self): 7 return len(self.__dict__) 8 a = A() 9 print(len(a)) 10 11 示例
2.4__hash__
1 class A: 2 def __init__(self): 3 self.a = 1 4 self.b = 2 5 6 def __hash__(self): 7 return hash(str(self.a)+str(self.b)) 8 a = A() 9 print(hash(a))
2.5 __str__
如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
1 class A: 2 def __init__(self): 3 pass 4 def __str__(self): 5 return '太白' 6 a = A() 7 print(a) 8 print('%s' % a)
2.6 __repr__
如果一个类中定义了__repr__方法,那么在repr(对象) 时,默认输出该方法的返回值。
1 class A: 2 def __init__(self): 3 pass 4 def __repr__(self): 5 return '太白' 6 a = A() 7 print(repr(a)) 8 print('%r'%a)
2.7__call__
对象后面加括号,触发执行。
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
1 class Foo: 2 3 def __init__(self): 4 pass 5 6 def __call__(self, *args, **kwargs): 7 8 print('__call__') 9 10 11 obj = Foo() # 执行 __init__ 12 obj() # 执行 __call__
2.8__eq__
1 class A: 2 def __init__(self): 3 self.a = 1 4 self.b = 2 5 6 def __eq__(self,obj): 7 if self.a == obj.a and self.b == obj.b: 8 return True 9 a = A() 10 b = A() 11 print(a == b)
2.9__del__
析构方法,当对象在内存中被释放时,自动触发执行。
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
2.10__new__ , 单例模式
1 class A: 2 def __init__(self): 3 self.x = 1 4 print('in init function') 5 def __new__(cls, *args, **kwargs): 6 print('in new function') 7 return object.__new__(A, *args, **kwargs) 8 9 a = A() 10 print(a.x)
1 class A: 2 __instance = None 3 def __new__(cls, *args, **kwargs): 4 if cls.__instance is None: 5 obj = object.__new__(cls) 6 cls.__instance = obj 7 return cls.__instance 8 9 单例模式
2.11 item系列
1 class Foo: 2 def __init__(self,name): 3 self.name=name 4 5 def __getitem__(self, item): 6 print(self.__dict__[item]) 7 8 def __setitem__(self, key, value): 9 self.__dict__[key]=value 10 def __delitem__(self, key): 11 print('del obj[key]时,我执行') 12 self.__dict__.pop(key) 13 def __delattr__(self, item): 14 print('del obj.key时,我执行') 15 self.__dict__.pop(item) 16 17 f1=Foo('sb') 18 f1['age']=18 19 f1['age1']=19 20 del f1.age1 21 del f1['age'] 22 f1['name']='alex' 23 print(f1.__dict__)