• python用内省优化显示


    1 python用内省优化显示

    1.1 class

    用法

    instance.__class__
    
    • 1

    描述

    获取实例所属类。为实例属性。

    示例

    >>> class MyClass:pass
    >>> c1=MyClass()
    >>> c1
    <__main__.MyClass object at 0x03D19C50>
    # __class__ 返回实例所属类
    >>> c1.__class__
    <class '__main__.MyClass'>
    # 用返回的类创建实例对象
    >>> c2=c1.__class__()
    >>> c2
    <__main__.MyClass object at 0x03D19CF0>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1.2 class.name

    用法

    instance.__class__.__name__
    
    • 1

    描述

    获取实例所属类的名字。返回字符串。

    示例

    >>> class MyClass:pass
    >>> c1=MyClass()
    >>> c1=MyClass()
    # __name__ 返回实例所属类的名字
    >>> c1.__class__.__name__
    'MyClass'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.3 bases

    用法

    .__bases__
    
    • 1

    描述

    返回该类的直接超类组成的元组

    示例

    >>> class MyClass:pass
    >>> class MyClassA(MyClass):pass
    >>> class MyClassB():pass
    # __bases__ 返回直接超类组成的元组
    >>> MyClassC.__bases__
    (<class '__main__.MyClassB'>, <class '__main__.MyClassA'>)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.4 dict

    类和实例的属性字典。

    实例无本身属性则为空。

    >>> class MyClass:
        s='梯阅线条'
        def f1(self):pass
    >>> c1=MyClass()
    # __dict__ 查看类的属性字典,
    # 前后带双下划线的为内置属性 , 其他为自定义属性
    >>> MyClass.__dict__.keys()
    dict_keys(['__module__', 's', 'f1', '__dict__', '__weakref__', '__doc__'])
    >>> c1.__dict__.keys()
    dict_keys([])
    >>> c1.a=9555
    >>> c1.__dict__.keys()
    dict_keys(['a'])
    >>> c1.s='tyxt'
    # __dict__ 查看实例的属性字典,
    # 只返回实例赋值的属性,不返回类的属性
    >>> c1.__dict__.keys()
    dict_keys(['a', 's'])
    >>> MyClass.__dict__.keys()
    dict_keys(['__module__', 's', 'f1', '__dict__', '__weakref__', '__doc__'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    1.5 _X

    python类内定义的_X:

    (1)单下划线开头的变量名,_X通常在工具类中用于避免与子类的命名冲突。

    比如,子类继承了一个工具类,然后定义了一个同名变量,那么会取到子类的变量,而实际想使用工具类里面的变量。此时,在工具类通过单下划下命名变量,可以很大程度上避免冲突。

    (2)_X一般只在类内调用,不在类外调用。

    1.6 __X

    python类内定义的__X

    (1) 双下划线开头的变量名,__X为伪私有类属性。

    (2) 自动在__X前面加“_类名”。

    示例

    >>> class MyClass:
        def me1(self):pass
        def _me2(self):pass
        def __me3(self):pass
    
    >>> [x for x in dir(MyClass) if not x.endswith('__')]
    ['_MyClass__me3', '_me2', 'me1']
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.7 getattr()

    用法

    getattr(object, name[, default])
    
    • 1

    描述

    返回对象的属性值。

    obejct:对象(类对象或实例对象)

    name:属性名的字符串

    default:不存在属性时返回的默认值,不存在属性未给默认值则报错

    示例

    >>> class MyClass:
        s='梯阅线条'
        def f1(self):
            print('f1')
    # getattr 第一个参数为 对象 object
    # 第二个参数为 字符串属性名
    # 返回数据属性值
    >>> getattr(MyClass,'s')
    '梯阅线条'
    # 返回行为属性值
    >>> getattr(MyClass,'f1')
    <function MyClass.f1 at 0x03D29F18>
    # 不存在的属性报错
    >>> getattr(MyClass,'x')
    Traceback (most recent call last):
      File "", line 1, in <module>
        getattr(MyClass,'x')
    AttributeError: type object 'MyClass' has no attribute 'x'
    # 不存在的属性给默认值
    >>> getattr(MyClass,'x','不存在')
    '不存在'
    >>> c1=MyClass()
    >>> getattr(c1,'s')
    '梯阅线条'
    >>> c1.s='tyxt'
    >>> getattr(c1,'s')
    'tyxt'
    # 返回行为属性值可以调用
    >>> f2=getattr(c1,'f1')
    >>> f2
    <bound method MyClass.f1 of <__main__.MyClass object at 0x03729830>>
    >>> f2()
    f1
    >>> getattr(c1,'f1')()
    f1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    1.8 示例-优化显示

    通过内省工具getattr()和__class__.name 动态显示属性值。

    文件

    myclasstools.py

    class ShowAttr:
        def collectAttrs(self):
            attrs = []
            for k in sorted(self.__dict__):
                attrs.append('{}={}'.format(k,getattr(self,k)))
            return ','.join(attrs)
         
        def __str__(self):
            return '{}:{}'.format(self.__class__.__name__,self.collectAttrs())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    myperson.py

    from myclasstools import ShowAttr
    class MyPerson(ShowAttr):
        def __init__(self,name,job = None,pay = 0):
            self.name = name
            self.job = job
            self.pay = pay
        def payraise(self,rate):
            self.pay = int(self.pay * (1 + rate))
        #def __str__(self):
            #return 'MyPerson:name={0.name},job={0.job},pay={0.pay}'.format(self)
    
    class MyManager(MyPerson):
        def __init__(self,name,job = 'mgr',pay = 0):
            MyPerson.__init__(self,name,job,pay)
        def payraise(self,rate,bonus=0.1):
            MyPerson.payraise(self,rate+bonus)
            
    if __name__ == '__main__':
        mp1 = MyPerson('mp1')
        mp2 = MyPerson('mp2','c++开发',20000)
        mm1 = MyManager('mm1','开发经理',50000)
        
        print(mp1)
        print(mp2)
        print(mm1)
        
        mp2.payraise(0.1)
        mm1.payraise(0.1)
        print(mp2)
        print(mm1)  
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    执行

    E:\documents\F盘>python myperson.py
    MyPerson:job=None,name=mp1,pay=0
    MyPerson:job=c++开发,name=mp2,pay=20000
    MyManager:job=开发经理,name=mm1,pay=50000
    MyPerson:job=c++开发,name=mp2,pay=22000
    MyManager:job=开发经理,name=mm1,pay=60000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    1.3 do...while实现1+...100 for实现1+...100
    arcgis 栅格数据处理2——栅格转地级市(栅格转矢量图)
    论文阅读:Auto White-Balance Correction for Mixed-Illuminant Scenes
    Web Components从技术解析到生态应用个人心得指北
    Docker:入门
    百数水印体系更新-让数据操作更安全
    C/S架构学习之UDP服务器
    uml简单用例图怎么画(要素,文字形式)
    【浅学Java】Spring对象的存储和读取
    语法复习之C语言与指针
  • 原文地址:https://blog.csdn.net/sinat_34735632/article/details/134278720