【问题标题】:Creating a child class from a parent method in python从python中的父方法创建子类
【发布时间】:2021-08-11 13:21:33
【问题描述】:

我正在尝试创建一个有一堆孩子的类,这些孩子都有自己的方法,但通过父级共享通用方法。问题是我需要在父方法中创建子类的实例,但不知道如何去做

到目前为止我的代码是这样的

def filterAttribute(self, attribute, value):
        newlist = []
        for thing in self._things:
            if thing._attributes[attribute] == value:
                newlist.append(thing)
        return self.__init__(newlist)

类构造函数接受一个列表作为它的唯一参数。有谁知道是否有这样做的标准方法,因为我的代码返回的是 NoneType 对象

以下是我制作的一些类的示例

这是父类:

class _DataGroup(object):
    def __init__(self, things=None):
        self._things=things
    
    def __iter__(self):
        for x in self._things:
            yield x
    
    def __getitem__(self, key):
        return self._things[key]
    
    def __len__(self):
        return len(self._things)

    def extend(self, datagroup):
        if(isinstance(datagroup, self.__class__)):
            self._things.extend(datagroup._things)
            self._things = list(set(self._things))

    def filterAttribute(self, attribute, value):
        newlist = []
        for thing in self._things:
            if thing._attributes[attribute] == value:
                newlist.append(thing)
        #return self.__init__(newlist)
        return self.__init__(newlist)

这是子类之一

class _AuthorGroup(_DataGroup):
    def __init__(self, things=None):
        self._things = things
    
    def getIDs(self):
        return [x.id for x in self._things]
    
    def getNames(self):
        return [x.name for x in self._things]

    def getWDs(self):
        return [x.wd for x in self._things]
    
    def getUrns(self):
        return [x.urn for x in self._things]

    def filterNames(self, names, incl_none=False):
        newlist = []
        for thing in self._things:
            if((thing is not None or (thing is None and incl_none)) and thing.name in names):
                newlist.append(thing)
        return _AuthorGroup(newlist)

我正在寻找的功能是我可以将父类与子类一起使用并创建子类的实例而不是整个 DataGroup 父类

【问题讨论】:

  • __init__() 可以返回除None 以外的值吗?你想用__new__() 而不是__init__() 做点什么吗? docs.python.org/3/reference/datamodel.html#object.__init__
  • 为什么要在父类中创建子类的实例?
  • @itprorh66 我正在创建一个包含某些对象列表的数据类,我有一般的过滤器,我希望所有这些列表都能够过滤,我有特定的过滤器,只有某些类可以做。如果我返回父类,我将无法访问子类附带的其他方法。父类是抽象的,不应该单独使用
  • @JonSG 我现在就试试看!
  • 这就是为什么你创建一个子类,它继承父类的方法和属性。孩子可以添加额外的方法和/或覆盖父方法。因此,当您创建子类的实例并在子类中使用 super.__init__ 时,您将获得父类的特性,永远没有理由从父类中调用子类。

标签: python-3.x


【解决方案1】:

因此,如果我正确理解您要完成的工作:

  • 您需要一个基类'DataGroup',它具有一组已定义的属性和方法;
  • 您希望一个或多个子类能够从基类继承方法和属性,并在必要时能够覆盖基类方法:并且
  • 您希望调用子类,而不必手动调用基类。

如果这确实是你的问题,我会这样做:

注意:我已经修改了几个函数,因为我认为您的代码还有其他几个问题,例如在基类 self._things 中设置为一个列表,但在函数 get_item 和 filterAttribute 中,您假设 self._things 是一个字典结构。我已经修改了函数,所以都假设 self._things 的 dict 结构

class _DataGroup:
    def __init__(self, things=None):
        if things == None:
            self._things = dict()  #Sets up default empty dict
        else:
            self._things=things
    
    def __iter__(self):
        for x in self._things.keys():
            yield x
 
    def __len__(self):
        return len(self._things)

    def extend(self, datagroup):
        for k, v in datagroup.items():
            nv = self._things.pop(k, [])
            nv.append(v)
            self._things[k] = nv  

# This class utilizes the methods and attributes of DataGroup
# and adds new methods, unique to the child class
class AttributeGroup(_DataGroup):
    def __init__(self, things=None):
        super.__init__(things)
        
    def getIDs(self):
        return [x for x in self._things]
    
    def getNames(self):
        return [x.name for x in self._things]

    def getWDs(self):
        return [x.wd for x in self._things]
    
    def getUrns(self):
        return [x.urn for x in self._things]
 
# This class over-rides a DataGroup method and adds new attribute
class NewChild(_DataGroup):
    def __init__(self, newAttrib, things = None):
        self._newattrib = newAttrib
        super.__init__(self, things)
        
    def __len__(self):
        return max(len(self._newattrib), len(self._things))

这些示例已简化,因为我不确定您真正想要什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2014-07-07
    • 1970-01-01
    • 2020-09-01
    • 2011-07-28
    相关资源
    最近更新 更多