python-面向对象中的特殊方法 ,反射,与单例模式

二,面相对象的特殊成员及相关内置函数

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))
View Code

 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)
View Code

 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)
View Code

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__
View Code

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)
View Code

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)
View Code
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__)
View Code
原文地址:https://www.cnblogs.com/liuye1990/p/9272801.html