Python: использование YAML для автоматического создания методов класса - PullRequest
0 голосов
/ 25 сентября 2018

Я пытался создать кучу похожих методов, используя файл конфигурации YAML.Тем не менее, я не смог найти что-то в сети или выяснить это.

example.yml

attributes:
  - a
  - b
  - c

пример класса

import yaml

class Test:
    def __init__(self):
        with open('example.yml', 'rb') as f:
            attrib_list = yaml.load(f)

        _list = []
        for name in attrib_list:
            _list.append(self.__setattr__('_' + name, None))

# create similar methods in a loop
         for name, _ in zip(attrib_list, _list):
             @property
             def name(self):  # I know name is a string so cannot be this way but how if this can be done?
                 return _

             @name.setter
             def __set + _(self, v):  # __set + '_' + name as method name
                 pass

             @name.getter
             def __get + _(self):  # __get + '_' + name as method name
                 pass

Есть ли эффективный способ созданиямного подобных методов таким образом, проходя через файл конфигурации?

Или есть лучший способ обработать что-то подобное?

Спасибо.

1 Ответ

0 голосов
/ 25 сентября 2018

Использование свойство класс

class Test:
    def __init__(self):
        with open('102.yaml', 'rb') as f:
            attrib_list = yaml.load(f)

        _list = []
        for name in attrib_list['attributes']:
            _list.append(self.__setattr__('_' + name, None))            
            setattr(self.__class__, name, 
               property( Test.getprop(self,name), Test.setprop(self,name)))

    @staticmethod
    def getprop(self,name):
        def xget(self):
            print("Get {}".format(name))
            return name
        return xget

    @staticmethod
    def setprop(self,name):
        def xset(self,value):
            print("Set {} to {}".format(name,value))
        return xset

>>> zz = Test()
>>> zz.a = "hallo"
Set a to hallo
>>> print(zz.a)
Get a
a
...