目录
isinstance(a,b) 判断a是否是b类(或者b类的派生类)实例化的对象
两个判断方法
isinstance(a,b) 判断a是否是b类(或者b类的派生类)实例化的对象
class A:
pass
class B(A):
pass
obj = B()
print(isinstance(obj,B)) #true
print(isinstance(obj,A)) #true
print(isinstance(B,A)) #false
issubclass 判断a是否是b类或者b类的派生类
class A:pass
class B(A):pass
class C(A):pass
b = B()
c = C()
print(issubclass(B,A)) #true
print(issubclass(C,A)) #true
# print(issubclass(b,B)) # TypeError: issubclass() arg 1 must be a class
# print(issubclass(b,A))
# print(issubclass(c,A))
元类:
type() 得到的结果就是 对象的本类
type(object) 返回值是 <class 'type'>
type 去实例化出来这些 类 抽象为 类也是一个对象
type 元类,也叫构建类,产出了Python的大量的内置类 (Object,以及object 的派生类)和 自建类
反射:
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
反射的方法:
getattr 获取属性或方法
# getattr(a,b) a指的是 Student 这个类名。 b 指的是 字符串类型值
hasattr 判断属性或方法是否存在
# hasattr (a,b) a指的是 Student 这个类名。 b 指的是 字符串类型
setattr 设置新的属性
# setattr(类名或对象名,属性名,修改后的属性名或新的属性值)
delattr 删除属性
# delattr (类名或对象名,被删除的属性名)
对实例化对象的反射:
class Foo:
f = '类的静态变量'
def __init__(self,name,age):
self.name=name
self.age=age
def say_hi(self):
print('hi,%s'%self.name)
obj=Foo('egon',73)
#检测是否含有某属性
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))
#获取属性
n=getattr(obj,'name') #等同于 obj.name
print(n)
func=getattr(obj,'say_hi')
func()
print(getattr(obj,'aaaaaaaa','不存在啊')) #报错
#设置属性
setattr(obj,'sb',True) #等同于 obj.sb = True
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))
#删除属性
delattr(obj,'age') #等同于 del obj.age
delattr(obj,'show_name')
delattr(obj,'show_name111')#不存在,则报错
print(obj.__dict__)
对类的反射:
class Foo(object):
staticField = "old boy"
def __init__(self):
self.name = 'wupeiqi'
def func(self):
return 'func'
@staticmethod
def bar():
return 'bar'
print getattr(Foo, 'staticField')
print getattr(Foo, 'func')
print getattr(Foo, 'bar')
对当前模块的反射
import sys
def s1():
print 's1'
def s2():
print 's2'
this_module = sys.modules[__name__] #比较推荐#sys.modules 获得到的是 当前文件的所有属性及方法,返回是一个字典
# 等同于 this.module = sys.modules["__main__"]
hasattr(this_module, 's1')
getattr(this_module, 's2')
对其他模块的反射
"""
程序目录:
module_test.py
index.py
"""
# module_test.py 中的代码
def test():
print('from the test')
# index.py 中的代码
import module_test as obj
#obj.test()
print(hasattr(obj,'test'))
getattr(obj,'test')()
反射的小例子
# 学生登录系统
class User:
def login(self):
print('欢迎来到登录页面')
def register(self):
print('欢迎来到注册页面')
def save(self):
print('欢迎来到存储页面')
user = User()
while 1:
choose = input('>>>').strip()
if hasattr(user,choose):
func = getattr(user,choose)
func()
else:
print('输入错误。。。。')