Можно ли использовать дескриптор Python для создания экземпляра атрибута в __init__ другого класса?

Или атрибут должен быть определен вне каких-либо методов класса?

Итак, мой объект дескриптора таков. В объекте 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__()

Но тогда у меня нет PTF и IDN, которые я определяю в классе basePageObject.

Что я могу сделать, чтобы сделать их доступными при создании атрибута имени пользователя?

Спасибо


person Skip Huffman    schedule 19.04.2012    source источник


Ответы (2)


Боюсь, это будет невозможно, так как ваш атрибут 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
person Anurag Uniyal    schedule 19.04.2012

Поскольку вам, вероятно, не понадобится имя пользователя, пока объект не будет создан, вероятно, лучше всего просто сделать его свойством и написать для него геттер.

person Ignacio Vazquez-Abrams    schedule 19.04.2012