Python面向对象(特殊成员及内置函数)
isinstance与issubclass
#isinstance判断是否属于这个类或者是否有血缘关系
class A:pass
class B(A):pass
obj = B()
print(isinstance(obj,B))
print(isinstance(obj,A))
#issubclass判断第一个类是否是第二个类的后代
class A:pass
class B(A):pass
obj = B()
print(issubclass(B,A))
print(issubclass(A,B))
反射
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个可以实现自省的函数
反射说简单点 --> 就是利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员。
下列方法适用于类和对象(一切皆对象,类本身也是一个对象)
对实例化对象的示例
class Foo:
f = '类的静态变量'
def __init__(self,name,age):
self.name=name
self.age=age
def AA(self):
print('hello,%s' %self.name)
obj = Foo('egon',74)
#检测是否含有某属性
print(hasattr(obj,'name'))
print(hasattr(obj,'AA'))
#获取属性
n = getattr(obj,'name')
print(n)
p = getattr(obj,'AA')
p()
print(getattr(obj,'AA','不存在'))
print(getattr(obj,'DSADSDSA','不存在'))
#设置属性
setattr(obj,'sb',True)
print(obj.__dict__)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))
#删除属性
delattr(obj,'age')
delattr(obj,'show_name')
delattr(obj,'show_name111')#不存在,则报错
print(obj.__dict__)
对类的示例
class Foo(object):
static = 'baidu'
def __init__(self):
self.name = 'yanghao'
def func(self):
return 'func'
@staticmethod
def bar():
return 'bar'
print(getattr(Foo,'static'))
print(getattr(Foo,'func'))
print(getattr(Foo,'bar'))
对当前模块的示例
import sys
def A1() :
print('A1')
def A2():
print('A2')
this_module = sys.modules[__name__]
hasattr(this_module,'A1')
getattr(this_module,'A2')
__len__
class A:
def __init__(self):
self.a = 1
self.b = 2
def __len__(self):
return len(self.__dict__)
a = A()
print(len(a))
__hash__
class A:
def __init__(self):
self.a = 1
self.b = 2
def __hash__(self):
return hash(str(self.a)+str(self.b))
a = A()
print(hash(a))
__str__
如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
class A:
def __init__(self):
pass
def __str__(self):
return '杨灏'
a = A()
print(a)
print('%s'%a)
__repr__
如果一个类中定义了__repr__方法,那么在repr(对象) 时,默认输出该方法的返回值。
class A:
def __init__(self):
pass
def __repr__(self):
return '杨灏'
a = A()
print(repr(a))
print('%r'%a)
__call__
对象后面加括号,触发执行。
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class Foo():
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print('yanghao')
obj = Foo() #执行__init__
obj() #执行__call__
__eq__
class A:
def __init__(self):
self.a = 1
self.b = 2
def __eq__(self, other):
if self.a == other.a and self.b == other.b:
return True
a = A()
b = A()
print(a == b)
__del__(知道即可)
析构方法,当对象在内存中被释放时,自动触发执行。 注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
__new__
class A:
def __init__(self):
self.x = 1
print('in init function')
def __new__(cls, *args, **kwargs):
print('in new function')
return object.__new__(A, *args, **kwargs)
a = A()
print(a.x)
#单例模式
class A:
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
obj = object.__new__(cls)
cls.__instance = obj
return cls.__instance
item系列
class Foo:
def __init__(self,name):
self.name=name
def __getitem__(self, item):
print(self.__dict__[item])
def __setitem__(self, key, value):
self.__dict__[key]=value
def __delitem__(self, key):
print('del obj[key]时,我执行')
self.__dict__.pop(key)
def __delattr__(self, item):
print('del obj.key时,我执行')
self.__dict__.pop(item)
f1=Foo('sb')
f1['age']=18
f1['age1']=19
del f1.age1
del f1['age']
f1['name']='alex'
print(f1.__dict__)