繁体   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