反射~~~
反射 使用字符串数据类型的变量名来获取这个变量的值
反射类中的变量: 静态属性 类方法 静态方法
class Foo: school = 'qinghua' #静态属性 country = 'China' language = 'English' @classmethod #类方法 def class_method(cls): print(cls.school) @staticmethod #静态方法 def static_method(): print('666666666') def wahaha(self): print('wahaha') A = Foo() A.wahaha() Foo.wahaha(1) A.class_method() Foo.class_method() Foo.wahaha() Foo.static_method() Foo.class_method() while 1: inpu = input('>>>') # 直接类名+inpu的 输入一个 打印一个 print(getattr(Foo,inpu)) ##if inpu == 'school':print(Foo.school) #如果输入的是school 就打印old_boy print(getattr(Foo, 'school')) #反射 类名 + 字符串"静态属性名" Foo.class_method() getattr(Foo, 'class_method')() Foo.static_method() getattr(Foo,'static_method')() print(getattr(Foo, 'wahaha')(1)) #不推荐用类名去反射一个方法名 print(hasattr(Foo, 'wahaha'))
反射对象中的变量 对象属性 普通方法
class Foo: def __init__(self,name,age): self.name = name self.age = age def eat(self): print('%s is eat' % self.name) p1 = Foo('alexsb',30) print(getattr(p1, 'name')) print(getattr(p1, 'age')) getattr(p1,'eat')()
alexsb
30
alexsb is eat
普通的给文件名 变更 和getattr方法
import os os.rename('English','English777') getattr(os,'rename')('English777','china')
本文件反射
import sys
getattr(sys.modules[name],'所有定义在这个文件中的名字')
setattr 给命名空间的某一个名字设置一个值
delattr 删除某一个命名空间中变量对应的值
内置方法
不用特别去调用这个方法就可以触发这个方法的执行
class Foo: def __str__(self): return 'abcd' def __repr__(self): return 'dcba' obj = Foo()
__str__ :
print(obj) 打印触发
‘%s’ % obj 格式化输出触发
str() 强转触发
__repr__:
'%r' % obj
repr(obj)