Какова роль __getattr__ и __setattr__ в этом фрагменте кода? - PullRequest
0 голосов
/ 16 апреля 2020

Я написал шаблон синглтона в python таким образом. Он работает нормально, но я не понимаю, что именно делают getattr и setattr ? В чем разница между getattr () и getattr , а также между setattr () и setattr в python? эти два метода ( getattr и setattr ) выполняют sth для внутреннего класса и как эти два метода различают guish для работы с внутренним классом, а не с внешним учебный класс ? заранее спасибо.


class Writer:
    class __file_writer:
        def __init__(self):
            self.variable = None

        def __str__(self):
            return str(id(self))

    instance = None

    def __new__(cls, *args, **kwargs):
        if not Writer.instance :
            Writer.instance = Writer.__file_writer()

        return Writer.instance

    def __getattr__(self, item):
        return getattr(self.instance,item)

    def __setattr__(self, key, value):
        return setattr(self.instance, key,value)



if __name__ == '__main__':
    obj1=Writer()
    obj1.name = 'moli'
    print(obj1.name)
    print(type(obj1))

    obj2 = Writer()
    obj2.name = 'ffff'
    print(obj2.name)
    print(obj1.name)
    print(obj1)
    print(obj2)

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Здесь нет никакой цели. Потому что при доступе к name вы получаете доступ к атрибуту name класса __file_writer, а не класса Writer.

Если вы наберете sh функцию __getattr__ для __file_writer класс, тогда вы сможете увидеть разницу, как он вызывается при попытке доступа к атрибуту name.

0 голосов
/ 16 апреля 2020

__ getattr __ работает, когда вы хотите найти атрибут, которого нет в этом классе.

и __ setattr __ , когда вы присваиваете значение атрибуту, который не существует в классе, проверьте эти два примера

https://python-reference.readthedocs.io/en/latest/docs/dunderattr/setattr.html#example

https://python-reference.readthedocs.io/en/latest/docs/dunderattr/getattr.html#example

...