面向对象的进阶---反射--一些内置方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象的进阶---反射--一些内置方法相关的知识,希望对你有一定的参考价值。
反射
反射和一些类的内置方法 1 isinstance ---- issubclass type()--判断 是不是 ininstance(object,cls) 判断 是不是类的对象 如果这个类有父类 这个对象也是这个父类的对象 issubclaaa(cls,cls) 判断一个类是不是另一个类的子类 ============================= 反射 ================================= 把一个字符串 类型的变量 变成一个 真实存在这个程序中的变量名,并且能够使用它
hasattr -- getattr People.contry === People.__dict__[‘country‘] 实际上都是 通过字符串 访问 属性 通过字符串 映射到属性 ---- 反射 ============================= 反射 ================================= ====================== hasattr -- getattr ====================== ===================xx.xx形式 -----对象.属性----- === 命令 ===== 1 类名 --调 方法 属性
2 对象 -- 调 方法 属性 # class Login: # r=‘Persoin‘ # @staticmethod # def register(): # print(‘regiseter‘) # @staticmethod # def login(): # print(‘login‘) # # cmd=input(‘>> cmd:‘) # if hasattr(Login,cmd): # getattr(Login,‘login‘)() # # if hasattr(Login,cmd): # # getattr(Login,‘register‘)() 3 模块 调用 # import demo1 # getattr(demo1,‘P‘)() # print(getattr(demo1,‘p‘)) 4 在自己模块中调用模块方法 # def login(): # print(‘login‘) # def register(): # print(‘register‘) # cmd=input(‘>>>‘) # import sys # getattr(sys.modules[__name__],cmd) # import sys # print(sys.modules[__name__]) #防止调用时候改变 ============================= 反射 ================================= ============================ setattr -创建一个属性 delattr -创建一个属性 ============================ # class Teacher: # school=‘Old_boy‘ # def __init__(self,name,age): # self.name=name # self.age=age # def teach(self): # print(‘teacher‘) # def laugth(): # print(‘sdasds‘) # # alex=Teacher(‘alex‘,29) # setattr(Teacher,‘school‘,‘OLD_BOY‘) # setattr -创建一个属性 # setattr(Teacher,‘laugth‘,laugth) # setattr -类创建一个j静态方法 # setattr(alex,‘laugth‘,laugth) # setattr -对象创建一个j静态方法 # # print(hasattr(alex,‘name‘)) # print(getattr(alex,‘name‘)) # getattr(alex,‘teach‘)() # print(getattr(alex,‘school‘)) # delattr(alex,‘age‘) # print(Teacher.__dict__) # print(alex.__dict__) # # ============================= 反射 =================================
面向对象高级
=========================== 面向对象高级 =============================== 内置函数 --- 类的内置方法 __len__ len(obj) 触发 # class SB: # def __init__(self,name,sex): # self.name=name # self.sex=sex # def __len__(self): # return len(self.__dict__) # pass # jiangyi=SB(‘jiangyi‘,‘male‘) # print(jiangyi.__dict__) # print(len(jiangyi)) __str__ __repr__ str() repr() 触发 # # 都有对应的 str(obj) repr(obj) # 优先使用----- repr --- str没有的会使用repr # class Animal: # def __init__(self,kind,name): # self.kind=kind # self.name=name # # def __str__(self): # # return ‘str kind: %s name: %s‘%(self.kind,self.name) # def __repr__(self): # return ‘repr kind: %s name: %s‘ % (self.kind, self.name) # cat=Animal(‘aelx‘,‘aegon‘) # # print(str(cat)) # print(repr(cat)) # # # print(‘%s‘%cat) # print(‘%r‘%cat) # # print(str([1,2])) __del__做一些清理工作 del 触发 ---析构方法 # 绑定给对象的--进行清理工作 默认 在最后执行 # del py ---删除对象 # class Course: # def __init__(self,name,price): # self.name=name # self.price=price # def __del__(self): # print(‘del 执行!‘) # # a=Course(‘a‘,1000) # print(‘====>>>‘) # del a __call__ 对象 可以执行 () 触发 # class Course: # def __init__(self,name,price): # self.name=name # self.price=price # def __call__(self): # print(‘ 执行!‘) # # a=Course(‘a‘,1000) # a() __eq__ obj==cat 相等 ==触发 # class Animal: # def __init__(self,name,kind): # self.name=name # self.kind=kind # def __eq__(self,obj): # if self.name==obj.name and self.kind==obj.kind: # return True # else: # return False # dog=Animal(‘dog‘,‘dog‘) # cat=Animal(‘cat‘,‘cat‘) # print(dog==cat) 描述符 ======== item系列 相关========= # li=[1,2,3] # dic={‘a‘:2} # print(dic[‘a‘]) 类似于字典的 [] 方法 # class Animal: # def __init__(self,name,sex): # self.sex=sex # self.name=name # def __getitem__(self,item): # getattr(self,item) # # self.__dict__[item] # def __setitem__(self,key,val): # setattr(self,key,val) # # self.__dict__[key]=value # def __delitem__(self,key): # delattr(self,key) # # self.__dict__.pop(key) # cat=Animal(‘name‘,‘sex‘) # print(cat[‘name‘]) # 获取 __getitem__(self,item) getattr(self,item) # print(cat[‘sex‘]) # cat[‘age‘]=19 # 修改 __setitem__(self,key,val) --- setattr(self,key,val) # print(cat[‘age‘]) # del cat[‘name‘] # 删除 __delitem__(self,key) delattr(self,key) # print(cat.__dict__) # ================================ __new__ 先执行 创建对象 创建self的 # class Teacher: # def __init__(self,name,sex): # self.name=name # self.sex=sex # def __new__(cls,*args,**kwargs): # object.__new__(cls,*args,**kwargs) #默认是从 object 创建 不同的对象 # return object # a=Teacher(‘AE‘,‘MALE‘) # b=Teacher(‘SD‘,‘MALE‘)
==================单例模式 ----始终只有一个对象 它的属性可以随着改变而改变====================== # class Teacher: # __isinstance=None # def __new__(cls,*args): # if not cls.__isinstance: # cls.__isinstance=object.__new__(cls) # 执行这个 创建一个对象 没有定义属性 # return cls.__isinstance # 控制只返回第一次创建的对象 # def __init__(self,name,cloth): # self.name=name # self.cloth=cloth # Tl=Teacher(‘刘禹锡‘,‘白色‘) # Tw=Teacher(‘王启帅‘,‘黑色‘) # print(Tl) # print(Tw) ================================================================== 例子 # from collections import namedtuple # Card=namedtuple(‘Card‘,([‘rank‘,‘suits‘])) # # class FranchDeck: # ranks=[str(n) for n in range(2,11)] + list(‘JQKA‘) # suits=[‘红心‘,‘黑桃‘,‘方块‘,‘梅花‘] # # def __init__(self): # self.cards=[Card(rank,suits) for rank in FranchDeck.ranks for suits in FranchDeck.suits] # def __len__(self): # return len(self.cards) # def __getitem__(self,item): # 依赖于deck[0] # getattr(self,item) # return self.cards[item] # def __setitem__(self,key,val):# shuffle # setattr(self,key,val) # self.cards[key]=val # deck=FranchDeck() # print(deck[0]) # from random import choice,shuffle # print(choice(deck)) # shuffle(deck) # print(choice(deck)) 例子 # class Person: # def __init__(self,name,age,sex,weight): # self.name = name # self.sex = sex # self.age = age # self.weight = weight # def __eq__(self,obj): # if self.name==obj.name and self.sex==obj.sex: # return True # def __hash__(self): # return hash(str(self.name)+str(self.sex)) # # def __str__(self): # return ‘name: %s sex: %s‘%(self.name,self.sex) # def __len__(self): # return len(self.__dict__) # p_list=[] # for j in range(0,100): # p_list.append(Person(‘alex‘,j,‘male‘,40)) # print(set(p_list))
以上是关于面向对象的进阶---反射--一些内置方法的主要内容,如果未能解决你的问题,请参考以下文章