簡體   English   中英

Python:嵌套類繼承

[英]Python: Nested Class Inheritance

可以在我的Base(超級)類中聲明子類的實例嗎?

if 'classB_args' in dictArg.keys() and dictArg['classB_args']:
    self['classB']=ClassA( dictArg['classB_args'] )

這樣做有副作用嗎? 在繼續前進之前,我應該知道些什么。 我早晚感覺會出問題...用cPickle,泡菜,還是PyQt拖放?..如果是的話,為什么會出現問題?

class Base(dict):
    def __init__(self, *args, **kwargs):
        super(Base, self).__init__(*args, **kwargs)
        self.setdefault('id', -1)
        self.setdefault('name', None)
        self.setdefault('classB', None)

        if not args or len(args)==0: return
        dictArg=args[0]

        if 'classB_args' in dictArg.keys() and dictArg['classB_args']:
            self['classB']=ClassA( dictArg['classB_args'] )

    def getClassB(self):
        return self['classB']

class ClassA(Base):
    def __init__(self, *args, **kwargs):
        if not (args or kwargs):   raise Exception('you need to give me *something*!')
        super(ClassA, self).__init__(*args, **kwargs)
        self.setdefault('win', None)
        self.setdefault('mac', None)

myDictArg= {'id':1, 'name':'MyName', 'win':'c:/windows', 'mac': '/Volumes/mac/', 'classB_args': {'id':1, 'name':'MyProject'}}

myInstance=ClassA(myDictArg)
print myInstance.getClassB()

如果您問它是否行得通,答案是肯定的,但我認為這是個好主意。 原因是這將您的基類鎖定為僅對ClassA真正有用...我認為該解決方案可能更清潔地執行以下操作:

myDictArg = {'id':1, 'name':'MyName', 'win':'c:/windows', 'mac': '/Volumes/mac/', 'classB': ClassA(id=1, name='MyProject')}

並放棄Base.__init__所有額外的classB_args瘋狂Base.__init__ 它更加明確,因此用戶最終會知道期望什么。

如果你真的不喜歡,你可以使用的類型self來確定使用什么,而不是指定ClassA直接這是一個好一點

self['classB'] = type(self)(dictArg['classB_args'])

現在,如果您從Base派生一個新類,將使用它來代替:

class Foo(Base): pass

instance = Foo(myDictArg)
print type(instance.getClassB())  # Foo !

其他一些無關的要點。

  1. 不要x in dct.keys()x in dct.keys()在python2.x中效率很低。 您可以x in dct :-)中執行x in dct
  2. 一般來說,編寫像getClassB這樣的簡單包裝器被認為是“非pythonic”的。 您可以直接在python中訪問數據。
  3. 您可以重寫if子句以對其進行一些清理:

這是如何做:

   if 'classB_args' in dictArg.keys() and dictArg['classB_args']:
        self['classB']=ClassA( dictArg['classB_args'] )

前往:

   # with this, you can remove the `self.setdefault('classB', None)` statement.
   item = dictArg.get('classB_args')
   self['classB'] = type(self)(item) if item else item

暫無
暫無

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

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