Python中获取属性:getattr、__get__、__getattr__和__getattribute__

在使用python 获取属性时 需要用到如下四个方法

  • getattr
  • __getattr__
  • __getattribute__
  • __get__

 

getattr

getattr (object, name[, default])是Python的内置函数之一,它的作用是获取对象的属性。

  • object 对象
  • name 属性名
  • default 当属性不存在时,返回的默认值

示例

>>> class Foo:
...     def __init__(self, x):
...         self.x = x
...
>>> f = Foo(10)
>>> getattr(f, 'x')
10
>>> f.x
10
>>> getattr(f, 'y', 'bar')
'bar'

_ __getattr _ __

object. __getattr__(self, name)是一个对象方法,如果找不到对象的属性时会调用这个方法。

这个方法应该返回属性值或者抛出AttributeError异常。

注意,如果通过正常机制能找到对象属性的话,不会调用__getattr__方法。

示例

>>> class Frob:
...     def __init__(self, bamf):
...         self.bamf = bamf
...     def __getattr__(self, name):
...         return 'Frob does not have `{}` attribute.'.format(str(name))
...
>>> f = Frob("bamf")
>>> f.bar
'Frob does not have `bar` attribute.'
>>> f.bamf
'bamf'

____ getattribute __ __

当访问 某个对象的属性时,会无条件的调用这个方法。这个方法只适用于新式类。
新式类就是集成自object或者type的类。

如果类还同时定义了__getattr__()方法,则不会调用__getattr__()方法,除非在__getattribute__()方法中显示调用__getattr__()或者抛出了AttributeError

该方法应该返回属性值或者抛出AttributeError异常。

为了避免在方法中出现无限递归的情况,应该总是使用基类的方法来获取属性:

>>> object.__getattribute__(self, name).

语法:object. __getattribute__(self, name)

示例

>>> class Frob(object):
...     def __getattribute__(self, name):
...         print "getting `{}`".format(str(name))
...         return object.__getattribute__(self, name)
...
>>> f = Frob()
>>> f.bamf = 10
>>> f.bamf
getting `bamf`
10

____ __ get ___ _

__get__()方法是描述符方法之一。描述符用于将访问对象属性转变成调用描述符方法。

示例:

class Descriptor(object):
    def __get__(self, obj, objtype):
        print "get value=%s" % self.val 
        return self.val

    def __set__(self, obj, val):
        print "set value=%s" % val
        self.val = val

class Stu(object):
    age = Descriptor()

stu = Stu()
stu.age = 12    # set value=12
print stu.age   # get value=12
                # 12


 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`__getattr__`和`__getattribute__`是Python特殊的方法,用于处理对象的属性访问和获取。 `__getattr__`用于在对象实例的属性不存在时被调用,通常在动态获取属性的情况下使用。当我们尝试访问一个对象上不存在的属性时,Python解释器会自动调用`__getattr__`方法。我们可以在这个方法定义对不存在属性的处理逻辑,比如返回默认值或者触发异常。 下面是一个示例: ``` class MyClass: def __getattr__(self, name): return f"Attribute {name} does not exist." obj = MyClass() print(obj.some_attr) # Output: Attribute some_attr does not exist. ``` `__getattribute__`用于在对象实例的属性被访问时被调用。与`__getattr__`不同,`__getattribute__`会在所有属性访问上被调用,无论属性是否存在。我们可以通过在`__getattribute__`方法自定义属性访问的行为,比如在访问属性前执行一些操作或返回特定的值。 下面是一个示例: ``` class MyClass: def __getattribute__(self, name): print(f"Accessing attribute {name}") return super().__getattribute__(name) obj = MyClass() print(obj.some_attr) # Output: # Accessing attribute some_attr # None ``` 注意,使用`__getattribute__`时需要谨慎,因为在方法内部访问同个实例的其他属性时可能会触发无限递归调用。在这种情况下,可以通过使用`super()`来避免无限递归。 综上所述,`__getattr__`和`__getattribute__`是Python用于处理对象属性访问和获取的特殊方法,分别用于处理不存在属性和所有属性的访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值