我们说我有以下描述符:
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_
据我所知,由于AttributeError
为my_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++;
}
}
}
。但是,我想知道是否有一种将元数据与描述符相关联的好方法。
编辑:调整后的措辞,表明每个类别有一个描述符实例。
答案 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__
的对象上)而不是描述符。