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
hasattr
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
setattr
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
delattr
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__: 相等