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

author author     2022-09-20     601

关键词:

反射

 反射和一些类的内置方法

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

 

面向对象:反射内置方法(代码片段)

反射:通过字符串映射到对象或者类的属性反射的方法:classPeople:country="China"def__init__(self,name,age):self.name=nameself.age=agedeftalk(self):print("%sistalking"%self.name)obj=People("neo",22)"""判断是否拥有某个属性:hasattr(o,name)#n 查看详情

面向对象-反射-其他内置方法(代码片段)

1.反射1.1反射含义通过字符串的形式操作对象的相关属性。方法有hasattr,getattr,delattr#!/usr/bin/envpython#-*-coding:utf-8-*-#Author:vitaclassPeople:country=‘China‘def__init__(self,name,age):self.name=nameself.age=agedeftalk(self): 查看详情

面向对象进阶

...  通过对象访问:普通字段,普通方法成员修饰符面向对象中一些常用特殊方法 __init__  __call__  __delitem__ 反射查找类的 查看详情

面向对象进阶(代码片段)

...的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。 2python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物 查看详情

面向对象之反射及内置方法

一、静态方法(staticmethod)和类方法(classmethod)类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性)静态方法:让类里的方法直接被类调用,就像正常调用函数一样类方法和静态... 查看详情

1面向对象内置函数2反射3内置方法

1、isinstance()  判断对象所属类型,包括继承关系2、issubclass()判断类与类之间的继承关系  classA:pass  classB(A):pass  print(isinstance(b,B)) #o,t  print(isinstance(b,A)) # o,t    classmystr(str):pass  ms=m 查看详情

面向对象进阶

目录面向对象进阶classmethod和staticmethodclassmethodstaticmethodisinstance和issubclassisinstanceissubclass反射魔法方法单例模式面向对象进阶Wisdomisknowingwhattodonext,virtueisdoingit.classmethod和staticmethodclassmethod装饰给类内部的方法 查看详情

面向对象进阶——内置方法(代码片段)

七、__setitem__,__getitem__,__delitem__  item系列classFoo:def__init__(self,name):self.name=namedef__getitem__(self,item):#print(‘getitem...‘)#print(item)returnself.__dict__.get(item)#字典get方法有则取值,无也不会报错def 查看详情

面向对象进阶

面向对象进阶一、反射1、定义:  反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它... 查看详情

反射(高大上)类的内置方法

...块的反射本模块的反射:找到本模块sys.modules[__name__]python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)hasattr()函数用于判断对象是否包含对应的属性。getattr()函数用... 查看详情

面向对象进阶(代码片段)

反射实现通过字符串取出同名的变量反射对象中的属性和方法classPerson:city=‘zhengzhou‘defshow_info(self):print(‘info---‘)@classmethoddefshow_city(cls):print(‘city---‘)#使用类调用属性ifhasattr(Person,‘city‘):#先判断有没有,有再获取,防止没... 查看详情

重修课程day26(面向对象6之反射,内置函数和常用模块)

一 软件的开发规范 基本的目录结构:bin目录:里面写start.py文件,启动程序。将当前的项目目录添加到sys.path,调用core文件下的所有脚本。         core目录:放一些主脚本文件,跟类相关的文件放在里面。在创... 查看详情

python------面向对象进阶反射详解(重点)(代码片段)

一.反射  通过字符串映射或者修改程序运行时的状态,属性,或者方法。1.getattr(object,name,default=None)2.hasattr(object,name)3.setattr(x,y,v)4.delattr(x,y)1classDog(object):2def__init__(self,name):3self.name=name45defeat(sel 查看详情

面向对象进阶(代码片段)

...的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。2python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可 查看详情

面向对象进阶一

一、利用反射查看面向对象成员归属反射:以字符串的形式去对象(模块)中操作成员记住点:1)反射如果查看对象:可以找对象,也可以找类的成员2)反射查看类:只能找类的成员如下代码#!/usr/bin/envpython#-*-coding:utf-8-*-classFo... 查看详情

面向对象进阶(代码片段)

isinstance(obj,cls)检查是否obj是否是类cls的对象issubclass(sub,super)检查sub类是否是super类的派生类反射反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。hasattr(object,nam... 查看详情

面向对象进阶(代码片段)

...的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。&n 查看详情

面向对象与继承

print(‘面向对象‘)‘‘‘今日内容:1,继承2,多态3,封装4,绑定方法和非绑定方法classmethodstaticmethod5,面向对象高级反射一些内置方法__str____del__6,元类(看视频)这个是属于面向对象底层的知识点,可能会打破你之前对于面向对象的知识... 查看详情