gpt4 book ai didi

python - 获取描述符对象的好方法

转载 作者:太空狗 更新时间:2023-10-29 21:16:02 26 4
gpt4 key购买 nike

在 Python 3 中

class A(object):
attr = SomeDescriptor()
...
def somewhere(self):
# need to check is type of self.attr is SomeDescriptor()
desc = self.__class__.__dict__[attr_name]
return isinstance(desc, SomeDescriptor)

有更好的方法吗?我不喜欢这个 self.__class__.__dict__ 东西

最佳答案

A.attr 导致 Python 调用 SomeDescriptor().__get__(None, A) 所以如果你有 SomeDescriptor.__get__ 返回 selfinstNone 时,A.attr 将返回描述符:

class SomeDescriptor():
def __get__(self, inst, instcls):
if inst is None:
# instance attribute accessed on class, return self
return self

然后你访问描述符

desc  = type(self).attr

如果属性的名称只是一个字符串,attr_name,那么您将使用

desc  = getattr(type(self), attr_name)

即使 selfA子类 的实例,这仍然有效,而

desc = self.__class__.__dict__[attr_name]

仅当 selfA 的实例时才有效。


class SomeDescriptor():
def __get__(self, inst, instcls):
if inst is None:
# instance attribute accessed on class, return self
return self
return 4

class A():
attr = SomeDescriptor()
def somewhere(self):
attr_name = 'attr'
desc = getattr(type(self), attr_name)
# desc = self.__class__.__dict__[attr_name] # b.somewhere() would raise KeyError
return isinstance(desc, SomeDescriptor)

这表明 A.attr 返回描述符,并且 a.somewhere() 按预期工作:

a = A()
print(A.attr)
# <__main__.SomeDescriptor object at 0xb7395fcc>
print(a.attr)
# 4
print(a.somewhere())
# True

这表明它也适用于 A 的子类。如果你取消评论desc = self.__class__.__dict__[attr_name],你会看到b.somewhere() 引发 KeyError:

class B(A): pass
b = B()
print(B.attr)
# <__main__.SomeDescriptor object at 0xb7395fcc>
print(b.attr)
# 4
print(b.somewhere())
# True

顺便说一句,即使你不能完全控制 SomeDescriptor 的定义,你仍然可以将它包装在一个描述符中,当 inst 为 None 时返回 self :

def wrapper(Desc):
class Wrapper(Desc):
def __get__(self, inst, instcls):
if inst is None: return self
return super().__get__(inst, instcls)
return Wrapper

class A():
attr = wrapper(SomeDescriptor)()
def somewhere(self):
desc = type(self).attr
# desc = self.__class__.__dict__[attr_name] # b.somewhere() would raise KeyError
return isinstance(desc, SomeDescriptor)

所以没必要用

desc = self.__class__.__dict__[attr_name]

desc = vars(type(self))['attr']

遇到同样的问题。

关于python - 获取描述符对象的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21629397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com