Есть ли спецификация метода / интерфейса c для атрибута в Python? - PullRequest
0 голосов
/ 07 мая 2020

Есть ли способ иметь метод, который обрабатывает атрибуты и возвращает желаемое значение в python? Ниже приведен пример того, чего я хочу достичь.

   class Foo():

        self.a = '123'
        self.b = '234'

        def hex_value(self,attribute): # method for attribute.
            return hex(attribute)


    if __name__=="__main__":
        obj = Foo()
        print(obj.a.hex) # should give hex value of 'a' by simply using dot operator.

1 Ответ

0 голосов
/ 07 мая 2020

Я чувствую себя немного грязным, взламывая что-то подобное вместе, но вы могли бы использовать для этого какой-то прокси-класс:

class Proxy():
    def __init__(self, value, parent):
        self.value = value
        self.parent = parent

    def __getattr__(self, attr):
        return self.parent.__getattribute__(attr + '_value')(self.value)

class Foo():

    def __init__(self):
        self.a = '123'
        self.b = '234'
        self.c = 'foo_Bar'

    def hex_value(self,attribute):
        return hex(int(attribute))

    def repeated_value(self,attribute):
        return attribute + " " + attribute + " " + attribute

    def __getattribute__(self, attr):
        if not attr.endswith('_value') and not attr.startswith('__'):
            return Proxy(super(Foo, self).__getattribute__(attr), self)
        return super(Foo, self).__getattribute__(attr)

if __name__=="__main__":
    obj = Foo()
    print(obj.a.hex) # should give hex value of 'a' by simply using dot operator.
    print(obj.c.repeated) # prints 'foo_Bar foo_Bar foo_Bar' 

Идея в том, что все, к чему вы получаете доступ в Foo, завернутый в прокси. И все, к чему вы обращаетесь в прокси-сервере, что недоступно, вместо этого вызывается создателем прокси (с добавленным '_value').

Но то, что вы можете, не означает, что вы должны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...