【发布时间】: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