zoukankan      html  css  js  c++  java
  • 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都是息息相关的。

  • 相关阅读:
    [循环卷积]总结
    [FFT/NTT/MTT]总结
    [BZOJ 4870] 组合数问题
    [BZOJ 4809] 相逢是问候
    [BZOJ 4591] 超能粒子炮-改
    __getattribute__
    __repr__
    __reduce__
    数据库查询转excel小工具
    Git常用操作
  • 原文地址:https://www.cnblogs.com/ZJGG/p/9111577.html
Copyright © 2011-2022 走看看