23,反射,内置方法。
反射
使用字符串数据类型的变量名来操作一个变量的值
使用反射获取某个命名空间的值,需要一个变量指向这个命名空间的字符串数据类型的名字,在使用getattr获取值,如果是变量能直接获取结果,
如果是函数,只能拿到内存地址,加上括号就是执行。
# hasattr() 判断一个命名空间中有没有这个名字
# getattr() 从命名空间中获取这个名字对应的值
a1.py#a1配置文件。 a = 1 b = 2 def wahaha():print('wahaha') class QQxing: a = 11 def __init__(self,name): self.name = name def ADCa(self): print('in ADCa',self.name)
a2.py#a2配置文件 import a1 #定义映射a1做映射配置文件。 print(getattr(a1,'a'))#结果1 print(getattr(a1,'b'))#结果2 getattr(a1,'wahaha')() cls = getattr(a1,'QQxing')#拿到的是QQxing的内存地址,赋值给变量cls。 print(getattr(cls,'a'))#打印11 obj = cls('ddd')#obj = 给a1的self配置文件传参。 getattr(obj,'ADCa')()#执行ADCa,打印内容
在一个配置文件之间的映射本地的变量 类,类中的方法。
import sys a = 1 b = 2 def wahaha():print('wahaha') # class QQxing: a = 11 def __init__(self,name): self.name = name def ADCa(self): print('in ADCa',self.name) print() #在使用moudules的时候需要定义import sys,才能实现一个配置文件之间的sys.modules调用, print(getattr(sys.modules[__name__],'a'))#1 print(getattr(sys.modules[__name__],'b'))#2 getattr(sys.modules[__name__],'wahaha')()# QQxing1 = getattr(sys.modules[__name__],'QQxing')('alex') print(QQxing1.a)#映射1 cls = getattr(QQxing1,'ADCa') obj = cls()
__len__方法:
class wahaha: def __init__(self,num,name,age): self.num = num self.name = name self.age = age def __len__(self): return len(self.__dict__) obj = wahaha(6,'alex',7) #判断类中有多少个属性,执行len,就相当于执行了了__len__ print(len(obj.__dict__)) print(len(obj))
__eq__:判断值是否相等的时候依赖__eq__的结果。
class QQxing: def __eq__(self, other): if type(self) == type(other) and self.__dict__ == other.__dict__: return True else: return False q1 = QQxing() q1.name = 1 q2 = QQxing() q2.name = 1 print(q1 is q2) #内存地址不同 print(q1 == q2)# 比较值相同 # print(q1.__dict__) # print(q2.__dict__) print(q1.__dict__ is q2.__dict__) #内存地址不同 print(q1.__dict__ == q2.__dict__) #值相同
__str__在调用对象的时候定义一个内置方法str可以使用在实例化一个对象完毕之后不打印内存地址
class Course: def __init__(self,name,price,period): self.name = name self.price = price self.period = period def __str__(self): return ''.join([self.name,str(self.price),self.period]) courses = [] python = Course('python',23000,'6 months') linux = Course('linux',18000,'6 months') courses.append(python) courses.append(linux) for course in courses: print(course) # print(course.name,course.price,course.period)
__repr__和__str__共同应用:
class Student: def __init__(self,name,sex,age): self.name = name self.sex = sex self.age = age def __str__(self): return self.name def __repr__(self): return '|'.join([self.name,str(self.sex),str(self.age)]) stu1 = Student('光头','male',40) print('student:%r' % stu1) print('student:%s' % stu1) print(repr(stu1)) print(str(stu1)) print(stu1) #在__repr__和__str__一起工作时,repr可以完全代替str工作,(除非想要单个值)
在没有实现str方法的情况下,repr能够完全代替str的功能,但是str不能代替repr的工作
在repr和str都存在的情况下。
repr方法和repr() %r 都是息息相关的
str方法和str()print() %s都是息息相关的。