python:hasattr()、setattr()、getattr()

参考1:https://www.cnblogs.com/cheyunhua/p/11016127.html

hasattr(object, name)

判断object对象中是否存在name属性【属性包含变量和方法】:有则返回True,没有则返回False

其中,name参数是string类型,所以不管是要判断变量还是方法,其名称都以字符串形式传参。getattr和setattr也同样。

class A():
    name = 'python'
    def func(self):
        return 'A()类的方法func()'

    
hasattr(A, 'name')    # True
hasattr(A, 'age')     # False
hasattr(A, 'func')    # True

getattr(object, name[, default])

获取object对象的属性的值。

1)如果存在    :返回属性值

2)如果不存在:分两种情况

>>>没有default参数时,会直接报错;

>>>给定了default参数,若对象本身没有name属性,则会返回给定的default值;如果给定的属性name是对象的方法,则返回的是函数对象,需要调用函数对象来获得函数的返回值;调用的话就是函数对象后面加括号,如func之于func();

另外还需要注意,如果给定的方法func()是实例函数,则不能写getattr(A, 'func')(),因为fun()是实例函数的话,是不能用A类对象来调用的,应该写成getattr(A(), 'func')();实例函数和类函数的区别可以简单的理解一下,实例函数定义时,直接def func(self):,这样定义的函数只能是将类实例化后,用类的实例化对象来调用;而类函数定义时,需要用@classmethod来装饰,函数默认的参数一般是cls,类函数可以通过类对象来直接调用,而不需要对类进行实例化;[这个地方原文作者写的非常好]

>>> class A():
        name = 'python'
        def func(self):
            return 'Hello world'

    
>>> getattr(A, 'name')
'python'

>>> getattr(A, 'age')    # age变量不存在则报错

Traceback (most recent call last):
  File "<pyshell#464>", line 1, in <module>
    getattr(A, 'age')
AttributeError: class A has no attribute 'age'


>>> getattr(A, 'age', 20)   # age变量不存在则报,但给了default默认值,返回默认值
20

>>> getattr(A, 'func')      # 提示未绑定
<unbound method A.func>

>>> getattr(A, 'func')()   # func()函数是实例方法,不能被类对象A调用,所以报错

Traceback (most recent call last):
  File "<pyshell#470>", line 1, in <module>
    getattr(A, 'func')()
TypeError: unbound method func() must be called with A instance as first argument (got nothing instead)

>>> getattr(A(), 'func')()  # A()是实例对象,所以可以调用func()
'Hello world'

>>> class A(object):    
        name = 'python'    
        @classmethod     # 有了classmethod修饰,说明func是类方法,所以可以被类对象直接调用  
        def func(cls):      
        return 'the method of A object.'

>>> getattr(A, 'func')()
'the method of A object.'>>>

setattr(object, name, value)

给object对象的name属性赋值value,如果对象原本存在给定的属性name,则setattr会更改属性的值为给定的value;如果对象原本不存在属性name,setattr会在对象中创建属性,并赋值为给定的value

>>> class A():
        name = 'python'
        def func(self):
            return 'Hello world'

    
>>> setattr(A, 'name', 'java')
>>> getattr(A, 'name')
'java'

>>> setattr(A, 'age', 20)
>>> getattr(A, 'age')
20

一般先判断对象中是否存在某属性,如果存在则返回;如果不存在,则给对象增加属性并赋值

class A():
    name = 'python'
    def func(self):
        return 'Hello world'
    

if hasattr(A, 'age'):
    print getattr(A, 'age')
else:
    setattr(A, 'age', 20)

原文作者还提供了一个高级示例:

# -*- coding:utf-8 -*-

import sys
import platform


class InfoCollection(object):

    def collect(self):
        # 收集平台信息
        # 首先判断当前平台,根据平台的不同,执行不同的方法
        try:
            func = getattr(self, platform.system().lower())
            info_data = func()
            formatted_data = self.build_report_data(info_data)
            return formatted_data
        except AttributeError:
            sys.exit("不支持当前操作系统: [%s]! " % platform.system())

    @staticmethod
    def linux():
        from plugins.collect_linux_info import collect
        return collect()

    @staticmethod
    def windows():
        from plugins.collect_windows_info import Win32Info
        return Win32Info().collect()

    @staticmethod
    def build_report_data(data):
        # 留下一个接口,方便以后增加功能或者过滤数据
        pass
        return data

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微风❤水墨

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值