可以使用python描述符来实例化另一个类的__init__中的属性吗?

时间:2012-04-19 16:06:03

标签: python descriptor

或者属性是否必须在任何类方法之外定义?

所以我的描述符对象就是这个。 IDN对象已经有一些关于UserNameField的信息,所以我想使用它。

class UserNameElement(basePageElement):
    _testMethodName="UserNameElement Test method"
    def __init__(self, IDN, PTF):
        print "creating UserNameElement"
        self.locator =  IDN.UserNameField()

这是我的通话课。我想在哪里实例化UserNameElement对象

class LoginPageObject(basePageObject):
    _testMethodName="LoginPageObject Test method"
    print "creating LoginPageObject"
    def __init__(self, BaseURL):
        super(LoginPageObject, self).__init__()
        self.username=UserNameElement(IDN=self.IDN, PTF=self.PTF)

似乎标准进程会将username = in放在通用类定义中,如下所示:

class LoginPageObject(basePageObject):
    _testMethodName="LoginPageObject Test   method"
    username=UserNameElement()
    print "creating LoginPageObject"
    def __init__(self, BaseURL):
        super(LoginPageObject, self).__init__()

但是我没有在basePageObject类中定义的PTF和IDN。

创建用户名属性后,我该怎么做才能使这些可用?

由于

2 个答案:

答案 0 :(得分:3)

我担心这是不可能的,因为您的属性username将通过正常的属性访问来解决,请参阅http://docs.python.org/howto/descriptor.html#invoking-descriptors

您可以通过覆盖__getattribute__并模拟type.__getattribute__()做什么

来逃脱
class MyD(object):
    def __init__(self, val):
        self.val = val

    def __get__(self, obj, objtype):
        return self.val

    def __set__(self, obj, val):
        self.val = val

class C(object):
    a = MyD(42)
    def __init__(self):
        self.d = MyD(42)

    def __getattribute__(self, name):
        attr = super(C, self).__getattribute__(name)
        if hasattr(attr, '__get__'):
            return attr.__get__(self, C)
        return attr

c = C()
print c.d
print c.a

输出:

42
42

答案 1 :(得分:1)

由于在实例化对象之前您可能不需要用户名,因此最好将其设为属性并为其编写getter。