【问题标题】:Can a python descriptor be used to instantiate an attribute in the __init__ of another class?可以使用 python 描述符来实例化另一个类的 __init__ 中的属性吗?
【发布时间】:2012-05-01 05:01:35
【问题描述】:

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

所以我的描述符对象是这个。 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= 放入通用类定义中,如下所示:

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

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

创建用户名属性后,我可以做些什么来使它们可用?

谢谢

【问题讨论】:

    标签: python descriptor


    【解决方案1】:

    恐怕这是不可能的,因为您的属性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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-09-17
        • 2011-10-24
        • 2010-10-07
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        • 2011-08-16
        • 1970-01-01
        • 2011-03-05
        相关资源
        最近更新 更多