Лучший способ передать объект нескольким унаследованным классам - PullRequest
0 голосов
/ 02 июня 2018

Я хочу знать, существует ли более эффективный способ передачи аргумента родительскому классу, который могут использовать все дочерние классы.Вот пример, где myVar нужно передать всем дочерним классам a.(только дочерний класс b в примере).Я хочу знать, есть ли способ сделать это, не требуя, чтобы все дочерние классы передавали myVar в качестве аргумента, где myVar всегда один и тот же объект.Может быть, есть шаблон проектирования для более эффективной системы?Спасибо.

class a(object):
    def __init__(self, myVar):
        self.myVar = myVar

class b(a):
    def __init__(self, myVar):
        super(b, self).__init__(myVar)

class c(object):
    def __init__(self, a):
        print a.myVar

a = b(2)
d = c(a)

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Есть несколько различных способов сделать это, в зависимости от того, что именно вы пытаетесь сделать.
Если вы не определите __init__ метод для своего класса, он автоматически унаследует__init__ метод родительского класса.Например:

class A(object):
    def __init__(self, my_var):
        self.my_var = my_var

class B(A):
    pass

class c(object):
    def __init__(self, a):
        print(a.my_var)

a = B(2)
d = C(a)

Если вы не хотите использовать метод __init__, вы всегда можете попытаться определить значение по умолчанию для родительского класса.

class A(object):

    DEFAULT_VALUE = 42

    def __init__(self, my_var=None):    
        self.my_var = my_var or self.DEFAULT_VALUE

class B(A):
    def __init__(foo, my_var=None):
        super(B, self).__init__(foo, my_var)

class c(object):
    def __init__(self, a):
        print(a.my_var)

a = B(2)
d = C(a)

Или с помощьюглобальная переменная.Будьте бдительны.

MY_VAR = None


class A(object):

    def __init__(self, my_var=None):
        global MY_VAR
        if MY_VAR is None:
            MY_VAR = my_var
        elif my_var and MY_VAR != my_var:
            print("WARNING: Value of {my_var} for `my_var` being ignored")
        else:
            pass

        self.my_var = MY_VAR


class B(A):

    def __init__(self, foo, my_var=None):
        super(B, self).__init__(my_var)
        self._foo = foo


class C(object):

    def __init__(self, a):
        print(a.my_var)


a = A(42)
b = B("bar")
c = C(b)
0 голосов
/ 02 июня 2018

Вы можете объявить myVar как переменную класса следующим образом:

class a(object):
    myVar = 2
    def __init__(self):
        ...

class b(a):
    def __init__(self):
        super(b, self).__init__()

class c(object):
    def __init__(self, a):
        print(a.myVar)

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