簡體   English   中英

多個Mixins和屬性

[英]Multiple Mixins and properties

我試圖創建一個具有它自己的特性的混合類,但作為類沒有初始化初始化屬性背后的“隱性”的變量。

class Software:

    __metaclass__ = ABCMeta

    @property
    def volumes(self):
        return self._volumes

    @volumes.setter
    def volumes(self, value):
        pass

class Base(object):

    def __init__(self):
        self._volumes = None

class SoftwareUser(Base, Software):

    def __init__(self):
        super(Base, self).__init__()

因此,以上是我想出的最佳解決方案,但實際情況是_volumes並不真正屬於基礎。 我可以在軟件類中添加一個init,但是超級調用不能同時在兩個mixins上使用。

第二個是我需要依賴於傳入調用的多個mixins,它們將始終需要基數,但是mixins會發生變化,因此我真的不希望來自未在該調用中混合的mixin中的變量。

如果有可能我可以讓mixin將其變量添加到類中,或者可以動態地調用mixin類的init的方法嗎?

有任何問題讓我知道。

謝謝

是的,這太過復雜了。 一個類(包括mixins)僅應負責在MRO中調用下一個實現,而不應將所有這些都編組。 嘗試:

class Software:

    @property
    def volumes(self):
       return self._volumes

    @volumes.setter
    def volumes(self, value):
       pass

    def __init__(self):
        self._volumes = None
        super().__init__()  # mixin calls super too


class Base(object):

    def __init__(self):
        other_vars = None


class SoftwareUser(Software, Base):  # note order

    def __init__(self):
        super().__init__()  # all you need here

好的,所以這是我想出的,如果我對復雜情況做了這樣的介紹,則可以接受其他答案。

class Software:

    @property
    def volumes(self):
       return self._volumes

    @volumes.setter
    def volumes(self, value):
       pass

    def __init__(self):
        self._volumes = None


class Base(object):

    def __init__(self):
        other_vars = None


class SoftwareUser(Base, Software):

    def _bases_init(self, *args, **kwargs):
        for base in type(self).__bases__:
            base.__init__(self, *args, **kwargs)

    def __init__(self, *args, **kwargs):
        self._bases_init(*args, **kwargs)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM