• 反射getattr


    @property   将类中的方法伪装成属性

    与@property相关的俩个   @方法.setter   修改操作    @方法.deleter   删除一个property属性的时候会执行被deleter装饰的方法

     在类的命名空间有什么:

      静态属性,

      方法(动态属性),

      @property方法

      类方法(@classmethod)

        类方法的默认参数:cls,指的是调用这个方法的类名

        类方法的调用方式:通过类名.类方法调用,本质就是方法  

        应用场景:如果你的整个方法中都没有用到对象命名空间中的名字,且你用到了类的命名空间中的名字(普通方法和property方法除外)

      静态方法(@staticmethod,)

        这个函数不需要默认参数self,cls

        静态方法的调用方式:通过类名.方法调用,本质是函数

        应用场景:函数在类中定义的时候,即类中函数

    isinstance:判断对象与类直接的关系

      判断这个对象是不是类的对象,这个类子类的对象

    issubclass(a,b):判断类与类之间的关系,(ab都必须是类,否则报错)

      判断这个类a是不是另一个类b的子类

    反射 getattr  

      使用:getattr(变量名(命名空间),字符串(属于一个命名空间的变量名))

      定义:反射 指使用字符串数据类型的变量名来获取这个变量的值

      应用场景:

        input:用户输入

        文件:从文件中读出的字符串,想转换成变量的名字

        网络:将网络传输的字符串转换成年糕变量的名字

    反射类的变量:静态属性,类方法,静态方法

    class Foo:
        School = "oldboy"
        County = "China"
        Language = "Chiness"
        @classmethod
        def class_method(cls):
            print(cls.School)
        def name(self):
            print("alex")
    a = Foo()
    while True:
        ch = input(">>>>>>>>>:").strip()
        if hasattr(a,ch):       #has 判断对象中是否存在这个方法
            getattr(a,ch)()     #执行方法

    反射对象中的变量:对象属性,普通方法

    class Foo:
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def eating(self):
            print("%s is eating"%self.name)
    a = Foo("lin",23)
    if hasattr(a,"name"):
        print(getattr(a, "name"))   #lin is eating
    getattr(a,"eating")()   #lin is eating

    反射文本中的变量 

    import sys

    sys.modules[__name__]    #反射本文件中的变量,固定使用这个命名空间

    import sys  #加载sys模块
    a = 1
    b = 2
    name ="alex"
    def hello():
        print("hello word")
    print(getattr(sys.modules[__name__], "a"))
    getattr(sys.modules[__name__],"hello")()

    hasattr   (a,"b") 判断对象中有没有“b”这个方法,与getattr配合使用,防止报错

    setattr (a,"b",c) 接受三个参数,命名空间,“变量名”,变量值

      

    class Foo:
        Country = "China"
    def func():
        print("hello world")
    Foo.Shool = "old boy"
    setattr(Foo,"teacher","alex")   #Foo.Shool = "old boy"与他作用相同,都是给类中增加属性
    print(Foo.__dict__) # 'Country': 'China','Shool': 'old boy', 'teacher': 'alex'等

    delattr   (a,"b")   删除命名空间中b这个属性,如果没有会报错

    class Foo:
        Country = "China"
    def func():
        print("hello world")
    Foo.Shool = "old boy"
    del Foo.Country
    print(Foo.__dict__)
    delattr(Foo,'Country')      #del Foo.Country作用是一样的
    print(Foo.__dict__)
  • 相关阅读:
    国密算法 SM3 摘要计算 java版
    《Java架构师的第一性原理》41存储之MySQL第10篇数据库切分
    《Java架构师的第一性原理》41存储之MySQL第9篇MySQL主从复制
    《Java架构师的第一性原理》41存储之MySQL第8篇索引
    《Java架构师的第一性原理》41存储之MySQL第7篇SQL执行原理
    《Java架构师的第一性原理》41存储之MySQL第5篇事务
    《Java架构师的第一性原理》41存储之MySQL第6篇锁
    《Java架构师的第一性原理》41存储之MySQL第4篇MySQL日志系统(BinLog、RedoLog、UndoLog)
    《Java架构师的第一性原理》41存储之MySQL第3篇存储引擎MyISAM、InnoDB
    《Java架构师的第一性原理》41存储之MySQL第2篇MySQL逻辑架构
  • 原文地址:https://www.cnblogs.com/yuncong/p/9568146.html
Copyright © 2020-2023  润新知