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都是息息相关的。

 

posted @ 2018-05-30 16:19  Mr~Zhang  阅读(168)  评论(0编辑  收藏  举报