isinstance和issubclass
isinstance(obj,cls) 检查是否是类cls的对象
issubclss(sub,super)检查sub类是否是super类的派生类
class Foo(object): pass obj=Foo() print(isinstance(obj,Foo)) class Foo(object): pass class Bar(Foo): pass print(issubclass(Bar,Foo))
反射
1 什么是反射
反射的概念是由smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用。并在lisp和面向对象方面取得了成绩
2 python 面向对象中的反射:通过字符串的形式操作对象相关的属性。
python中的一切事物都是对象,也就是说都可以使用反射
四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象)
hasattr getattr setattr delattr
def hasattr(*args, **kwargs): # real signature unknown """ Return whether the object has an attribute with the given name. This is done by calling getattr(obj, name) and catching AttributeError. """ pass
def setattr(x, y, v): # real signature unknown; restored from __doc__ """ Sets the named attribute on the given object to the specified value. setattr(x, 'y', v) is equivalent to ``x.y = v'' """ pass
def delattr(x, y): # real signature unknown; restored from __doc__ """ Deletes the named attribute from the given object. delattr(x, 'y') is equivalent to ``del x.y'' """ pass
class Foo: f="static" def __init__(self,name,age): self.name=name self.age=age def say_hi(self): print("hi,%s"%self.name) obj=Foo("huazai",32) #obj.say_hi() print(hasattr(obj,'say_hi')) n=getattr(obj,"name") print(n) func=getattr(obj,"say_hi") func() print(getattr(obj,"sex","ca+")) setattr(obj,"sex","man") print(obj.__dict__) setattr(obj,"show_name",lambda self:self.name+"牛B") print(obj.show_name(obj)) delattr(obj,"age") print(obj.__dict__)
导入其他模块,利用反射查找该模块是否存在,然后执行某个方法
#module-test.py def test(): print(__file__) #index.py import module_test as obj #导入模块 起个别名 #obj.test() print(hasattr(obj,"test")) #验证这个obj里是否存在test这个属性(静态属性和动态属性可以这样表示) func=getattr(obj,"test") #若存在则执行这个方法 这一步可以简化getattr(obj,"test")() func()
类中的内置方法
改变对象的字符串显示:__str__ __repr__
自己定制格式化字符串:__format__
__del__:析构方法,当对象在内存中被释放时,自动触发执行
item系类
__getitem__
__setitem__
__delitem__
__new__ 构造方法
__call__:对象后面加括号,触发执行
__len__: 显示长度
__hash__
__eq__: 相等