Как расширить класс, только если он существует - PullRequest
0 голосов
/ 19 июня 2019

Я строю некоторый код из таблицы стилей, но я также хочу иметь возможность добавлять пользовательский класс в Python. Однако иногда пользовательский класс не существует. Например, у меня есть два класса: foo_base и foo_custom. Я хочу определить класс foo, который может расширять оба класса, или просто foo_base, если foo_custom не существует

try:
    def foo(foo_base, foo_custom):
except:
    def foo(foo_base):
...
        def __init__(self):
            ...

Надеюсь, это имеет смысл. По сути, я хочу расширить класс, если он существует.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Вы можете использовать реестр для регистрации ваших классов, а затем проверить реестр, чтобы увидеть, существует ли он.

class Registry(): #Creating Registry class

   def __init__(self):
      self.registry = []

   def register(self,class_):
      self.registry.append(class_) 
      return class_

   def check(self, class_):
       if class_ in self.registry:
           return True

registry = Registry()  #Creating Registry object

@registry.register  #Adding to the Registry
class Some():
     pass
Some()  #Creating class instance
print(registry.check(Some))  #Checking if it exists
#Output
#True

Тогда нужно просто позвонить

if registry.check(your_class):
   #Do something```
0 голосов
/ 19 июня 2019

Вместо того, чтобы использовать какое-то исключение для обработки только двух случаев, аргумент родительского класса в конструкторе типов (т. Е. Оператор class) допускает расширение аргумента списка в Python 3. Так, что вы могли бы сделать дляНапример:

parent_classes = [MainParent]

# it is also possible to make use of `importlib` to go through a
# list of possible imports rather than doing this one-by-one in
# this verbose manner
try:
    from might_be_missing import SomeOtherClass
except ImportError:
    pass  # perhaps log a warning of some kind
else:
    parent_classes.append(SomeOtherClass)

# To create the class

class YourClass(*parent_classes):
    """
    The main class definition
    """

Однако этот конкретный шаблон обычно не является полезным шаблоном для конечных пользователей этого класса, поскольку он не обеспечивает стабильного поведения, которое пользователи могут легко вывести, учитывая, чтоэто застряло за системой, которую они не обязательно могут контролировать.Более полезной техникой наследования классов может быть композиция класса для проблемы , которую вы, возможно, действительно решаете .

Пожалуйста, также см .: Python: Наследование против композиции

...