class A: def func1(self):pass #对象与方法之间的绑定 def func4(self):pass #对象与方法之间的绑定 @classmethod def func2(cls):pass #类与方法之间的绑定 @staticmethod def func3():pass
print(A.func1)
print(a.func1)
print(b.func1)
类方法 由于不适用于对象内存空间中的属性,所以不会将对象和方法绑在一起
而是将类和方法绑在一起
python处处皆对象
class B: pass b1 = B() b2 = b1 print(b1)
二,内置函数
class B:pass class C(B):pass class D(C):pass print(issubclass(C,D)) print(issubclass(D,C)) print(issubclass(B,C)) print(issubclass(C,B)) print(issubclass(D,B))
# issubclass(子类名,父类名) 如果返回True,说明有继承关系
三,反射
# role = 123 # print(eval('role')) # class A: # role = 'Person' # def func(self): # print('*'*self) # # ret = input('>>>') # # print(A.__dict__[ret]) # # getattr # print(getattr(A,'role')) # 从A的命名空间里找一个属性 ,直接就可以找到这个属性的值 # f = getattr(A,'func');f(1) # 从A的命名空间里找一个方法 ,找到的是这个方法的内存地址 # getattr(A,'func')(1)
反射
正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值
使用字符串数据类型的变量名 访问一个命名空间中的名字
找一个属性,直接就可以找到这个属性的值
找一个方法,找到的是这个方法的内存地址
hasattr() 判断一个命名空间中有没有这个名字
getattr() 从命名空间中获取这个名字对应的值
类中的反射
类可以获取类中的属性和方法
class A: role = 'Person' def func(self): print('*'*self) print(hasattr(A,'r')) print(hasattr(A,'role')) print(hasattr(A,'func'))
执行输出:
class A: role = 'Person' def func(self): print('*'*self) print(hasattr(A,'r')) print(hasattr(A,'role')) print(hasattr(A,'func')) ret = input('>>>') if hasattr(A,ret): print(getattr(A,ret)) # getattr从A的命名空间里找一个属性 ,属性不存在会报错 else: print('filed')
class A: role = 'Person' def __init__(self): self.money = 500 def func(self): print('*'*10) a = A() print(a.func) getattr(a,'func')()
import os os.rename('userinfo','user') getattr(os,'rename')('user','user_info')
# 类使用类命名空间中的名字
# 对象使用对象能用的方法和属性
# 模块使用模块中的名字
# import os ; getattr(os,'rename')('user','user_info')
# 从自己所在的模块中使用自己名字
import sys # 和python解释器相关的内容都在sys里 print(sys.modules['__main__']) func = input('>>>') if hasattr(sys.modules['__main__'],func): getattr(sys.modules['__main__'],func)
类使用命名空间中的名字
getattr(类名,'名字')
对象使用对象能用的方法和属性
getattr(对象名,’名字‘)
模块使用模块中的名字
导入模块
getattr(模块名,'名字')
import os ; getattr(os,'renama')('user','user_info')
从自己所在的模块中使用自己名字
import sys
getattr(sys.modules['__main__'],名字)
getattr 一定要和hasattr配合使用
反射 4个内置函数
getattr ******
hasattr ******
setattr #修改和新建 **
delattr #删除一个属性 *
#增删改 对象属性
#增删改 对象属性 class A: def __init__(self,name): self.name = name def wahaha(self): print('wahahahaha') a = A('alex') # a.name a.wahaha() print(a.__dict__) setattr(a,'age',18) print(a.__dict__)
#增删改 对象属性 class A: def __init__(self,name): self.name = name def wahaha(self): print('wahahahaha') a = A('alex') # a.name a.wahaha() print(a.__dict__) setattr(a,'age',18) print(a.__dict__) setattr(a,'name','egon') ####给a对象添加一个属性 print(a.__dict__)
#增删改 对象属性 class A: def __init__(self,name): self.name = name def wahaha(self): print('wahahahaha') a = A('alex') # a.name a.wahaha() print(a.__dict__) setattr(a,'age',18) print(a.__dict__) setattr(a,'name','egon') ####给a对象添加一个属性 print(a.__dict__) #del a.age delattr(a,'age') print(a.__dict__)