反射 ****
isinstance(obj,cls) #检查·是否obj 是类cls 对象
class A:pass
class B(A):pass
a = A()
print(isinstance(a,A))
issubclass(sub,super)#检查sub类是否是super类的派生类
class A:pass
class B(A):pass
a = A()
print(issubclass(B,A))
#反射
是用字符串类型的名字 去操作 变量
name=1
eval(print(name))
#反射对象中的属性和方法 # hasattr getattr setattr delattr
class A:
def func(self):
print('in func')
a = A()
a.name = 'alex'
a.age = 63
# 反射对象的属性
ret = getattr(a,'name') # 通过变量名的字符串形式取到的值
a.__dict__
模块 之间也能反射
模块
import my
反射模块的属性
print(my.day)
print(getattr(my,'day'))
反射模块的方法
getattr(my,'wahaha')()
eg
def qqxing():
print('qqxing')
year = 2018
import sys
# print(sys.modules['__main__'].year)
反射自己模块中的变量
print(getattr(sys.modules['__main__'],'year'))
反射自己模块中的函数
getattr(sys.modules['__main__'],'qqxing')()
输入执行的参数
def qqxing():
print('qqxing')
year = 2018
import sys
# print(sys.modules['__main__'].year)
变量名 = input('>>>')
print(getattr(sys.modules[__name__],变量名))
几个内置的方法
# 内置的类方法 和 内置的函数之间有着千丝万缕的联系
obj.__str__ str(obj)
obj.__repr__ repr(obj) #原型毕露
自己实现str 方法
class Teacher:
def __init__(self,name,salary):
self.name = name
self.salary = salary
def __str__(self): #重定向了 执行str返回的内容
return "Teacher's object :%s"%self.name
def __repr__(self):
return str(self.__dict__)
def func(self):
return 'wahaha'
nezha = Teacher('哪吒',250)
print(nezha) # 打印一个对象的时候,就是调用a.__str__
print(repr(nezha)) #<==>print('%r'%nezha)
print('>>> %r'%nezha)
#repr 是str 的备胎
print(obj)/'%s'%obj/str(obj)的时候,实际上是内部调用了obj.__str__方法,如果str方法有,那么他返回的必定是一个字符串
如果没有__str__方法,会先找本类中的__repr__方法,再没有再找父类中的__str__。
repr(),只会找__repr__,如果没有找父类的
析构函数
def del(self): # 析构函数: 在删除一个对象之前进行一些收尾工作
__del__
class A:
def __del__(self): # 析构函数: 在删除一个对象之前进行一些收尾工作
self.f.close()
a = A()
a.f = open() # 打开文件 第一 在操作系统中打开了一个文件 拿到了文件操作符存在了内存中
del a # a.f 拿到了文件操作符消失在了内存中
引用计数与删除完成有关
call 方法()
class A:
def __init__(self,name):
self.name = name
def __call__(self):
'''
打印这个对象中的所有属性
:return:
'''
for k in self.__dict__:
print(k,self.__dict__[k])
a = A('alex')() # 执行了call 方法