如何访问存储在Python描述符上的属性?

时间:2016-05-11 17:40:15

标签: python

我们说我有以下描述符:

class MyDescriptor(object):

    def __init__(self, name, type_):
        self.name = name
        self.type_ = type_

    def __set__(self, obj, value):
        assert isinstance(value, self.type_)
        obj.__dict__[self.name] = value

有没有办法从使用type_的对象访问MyDescriptor

class MyObject(object):
    x = MyDescriptor('x', int)

my_object = MyObject()
my_object.x = 5
print my_object.x.type_

据我所知,由于AttributeErrormy_object.x,因此int会提升import java.util.Scanner; import java.util.StringTokenizer; public class StringTokenDemo { public static void main(String[] args) { Scanner sc=new Scanner(System.in); String sentence=sc.nextLine(); StringTokenizer tokenizer=new StringTokenizer(sentence," "); int i=1; while (tokenizer.hasMoreTokens()) { String token=(String)tokenizer.nextToken(); System.out.println("#word"+i+" "+token); i++; } } } 。但是,我想知道是否有一种将元数据与描述符相关联的好方法。

编辑:调整后的措辞,表明每个类别有一个描述符实例。

2 个答案:

答案 0 :(得分:2)

您需要访问实际的描述符对象。对于您的描述符,可以使用

完成
type(my_object).x.type_

MyObject.x.type_

对于MyObject.x不是实际描述符对象的描述符,例如Python 2上的函数,您可能需要通过查看类__dict__来查找描述符,或者查看所有描述符MRO中的类,如果您想要一种通用的方法来查找继承的描述符。 (对于我刚才提到的特定情况,您也可以使用未绑定方法对象的__func__属性,但这对其他描述符不起作用。)

答案 1 :(得分:2)

  

有没有办法从拥有MyDescriptor实例的对象实例访问type_?

没有拥有MyDescriptor实例的对象实例。 MyDescriptor的一个实例存储在中,描述符是一个属性(在您的示例中为MyObject)。这就是描述符的工作原理。您可以通过类访问此描述符实例,如user2357112的答案中所述,但请注意您正在访问类级数据。如果要使用描述符存储实例级数据,则需要将其存储在实例本身(即,作为obj传递给__set__ / __get__的对象上)而不是描述符。