面向对象的进阶---反射--一些内置方法

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))

 

以上是关于面向对象的进阶---反射--一些内置方法的主要内容,如果未能解决你的问题,请参考以下文章

铁乐学python_day24_面向对象进阶1_内置方法

面向对象高级进阶

python进阶:面向对象进阶

issubclass和isinstance,反射,内置方法

Python基础-第七天-面向对象编程进阶和Socket编程简介

面向对象进阶