zoukankan      html  css  js  c++  java
  • python-hasattr()、getattr()、setattr()函数的使用

    python中hasattr()、getattr()、setattr()函数

    class A():
        name = 'python'
        def __init__(self):
            setattr(self.__class__, 'func_class', self.func)
        def func(self):
            return 'Hello world:func'
        @classmethod
        def funcmethod(cls):
            return 'Hello world:funcmethod'
    
    """
    hasattr(object, name)
    判断object对象中是否存在name属性,属性包含变量和方法;有则返回True,没有则返回False;
    name为string类型
    """
    print('hasattr==>')
    print(hasattr(A, 'name'))   #判断变量
    print(hasattr(A, 'func'))   #判断方法
    
    
    """
    getattr(object, name[, default])
    获取object对象的name属性的值,如果存在则返回属性值,不存在需要给定值,否则报错
    属性为方法时:1实例类,2加括号调方法
    """
    print('getattr==>')
    print(getattr(A, 'name'))           #返回已定义属性值,再给定值也是无效
    print(getattr(A, 'age', 20))        #返回未定义属性需要给定值,否则报错;不可在下次直接使用
    print(getattr(A, 'func'))           #返回函数对象
    print(getattr(A(), 'func')())       #返回函数的返回值
    print(getattr(A, 'funcmethod')())   #返回@classmethod函数的返回值
    
    
    """
    setattr(object, name, value)  object为对象不是单纯的字符串
    给object对象的name属性赋值,存在则修改,不存在则创建(可在同一个实例中直接使用)
    """
    print('setattr==> name:{}'.format(getattr(A, 'name')))
    setattr(A, 'name','shuzf')   #修改变量值
    setattr(A, 'age',30)        #创建变量并赋值
    print(getattr(A, 'name'))   #返回已定义属性值
    print(getattr(A, 'age'))    #返回未定义属性
    
    """
    value为该对象方法时:获取name属性值,即获取方法;外部赋值方法为类静态方法,内部赋值不需要直接self.func
    """
    setattr(A,'funcmethod_class',A.funcmethod) #创建变量并赋值方法
    print(getattr(A,'func_class')())           #返回未定义属性值,内部赋值,值为方法
    print(getattr(A,'funcmethod_class')())     #返回未定义属性值,外部赋值,值为方法
    
    
    
    hasattr==>
    True
    True
    getattr==>
    python
    20
    <function A.func at 0x02C5D6F0>
    Hello world:func
    Hello world:funcmethod
    setattr==> name:python
    shuzf
    30
    Hello world:func
    Hello world:funcmethod

    对上面演示:对于已实例的对象,则不需要考虑是否是静态方法

    import sys
    class A:
        def __init__(self, str):
            self.name = str    #name不为该类的属性
            setattr(self.__class__, self.name, self.test)
    
        def test(self):
            return sys._getframe().f_code.co_name
    
    if __name__ == '__main__':
        a = A("shuzf")
        
        print(a.shuzf)
        print(a.shuzf())
        print(getattr(a,'shuzf'))
        print(getattr(a, 'shuzf')())
    
        setattr(a,'func',a.test)
        print(a.func)
        print(a.func())
        print(getattr(a,'func'))
        print(getattr(a,'func')())

     对上面演示:对于类内部使用三函数,类名、self都是可以的;创建多个实例类时

    A.name创建的属性可以多个实例相互使用,说明地址没有回收
    setattr创建的属性只能同一个实例使用
    class A():
        def __init__(self):
            setattr(self.__class__, 'func_class', self.func)
        def func(self):
            print(hasattr(self, 'name'))  # 判断变量
            A.name = 'python'  #创建变量
            #setattr(self, 'name','python')# 创建变量
            print(getattr(self, 'name'))  # 获取变量
            return 'Hello world:func'
        @classmethod
        def funcmethod(cls):
            return 'Hello world:funcmethod'
    
    print(getattr(A(), 'func')())
    print(getattr(A(), 'func')())
  • 相关阅读:
    【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    107. Binary Tree Level Order Traversal II
    109. Convert Sorted List to Binary Search Tree
    108. Convert Sorted Array to Binary Search Tree
    110. Balanced Binary Tree
    STL容器迭代器失效问题讨论
    113. Path Sum II
    112. Path Sum
  • 原文地址:https://www.cnblogs.com/shuzf/p/11753724.html
Copyright © 2011-2022 走看看