isinstance和issubclass
class Foo:
pass
class Son(Foo):
pass
s = Son()
#判断一个对象是不是这个类的对象,传两个参数(对象,类)
# print(isinstance(s,Son))
# print(isinstance(s,Foo))
# print(type(s) is Son)
# print(type(s) is Foo)
#判断一个类是不是另一类的子类,传两个参数(子类,父类)
print(issubclass(Son,Foo))
print(issubclass(Son,object))
print(issubclass(Foo,object))
print(issubclass(int,object))
反射
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个方法:hasattr(),getattr(),setattr(),delattr()
1.对象中
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age
def fun(self):
print("...........ctz")
f = Foo("tiga", 21)
print(hasattr(f, "name")) # True
print(hasattr(f, "age")) # True
print(hasattr(f, "fun")) # True
print(getattr(f, "name")) # tiga
print(getattr(f, "age")) # 21
print(getattr(f, "fun")) # <bound method Foo.fun of <__main__.Foo object at 0x7ff760d54b10>>
fu = getattr(f, "fun")
fu() # ...........ctz
print("".center(50, "-"))
setattr(f, "name", "tiga")
setattr(f, "age", 73)
print(f.name, f.age) # tiga 73
print("--------------------")
delattr(f, "name")
print(f.name)
"""
Traceback (most recent call last):
File "xx.py", line 30, in <module>
print(f.name)
AttributeError: 'Foo' object has no attribute 'name'
"""
2.类中
class Foo:
f=123
@staticmethod
def static():
print("static......")
@classmethod
def clas(cls):
print(cls.f,"class.............")
print(hasattr(Foo,"f"))
print(hasattr(Foo,"static"))
print(hasattr(Foo,"clas"))
if hasattr(Foo,"f"):
print(getattr(Foo,"f"))
print(getattr(Foo,"static"))
print(getattr(Foo,"clas"))
s=getattr(Foo,"static")
s()
c=getattr(Foo,"clas")
c()
True
True
True
123
<function Foo.static at 0x000000000241B9D8>
<bound method Foo.clas of <class '__main__.Foo'>>
static......
123 class............
3.模块
import sys
import my_module
from my_module import test
print(hasattr(my_module, 'test'))
func_test = getattr(my_module, 'test')
func_test()
getattr(my_module, 'test')()
# import其他模块应用反射
def demo1():
print('demo1')
print(__name__) # '__main__'
print(sys.modules)
# '__main__': <module '__main__' from 'xx.py'>
module_obj = sys.modules[__name__] # sys.modules['__main__']
# module_obj : <module '__main__' from 'xx.py'>
print(module_obj)
print(hasattr(module_obj, 'demo1'))
getattr(module_obj, 'demo1')()