如何定义方法,以便 return 当前 class 的实例而不是 Python 继承的 class 的实例?

How to define a method so that return the instance of the current class not of the class where it was inherited in Python?

我正在尝试重载运算符,强制它 return 当前 class 的同一实例的对象,而不是重载方法的父 class 对象。

class Book:
    def __init__(self,name,pages):
        self.name=name
        self.pages=pages

    def __add__(self,other):
        return Book(self.name,(self.pages + other.pages))


class Encyclopedia(Book):
    def __init__(self,name,pages):
        Book.__init__(self,name,pages)


a=Encyclopedia('Omina',234)
b=Encyclopedia('Omnia2',244)
ab=a+b
print ab

Out: <__main__.Book instance at 0x1046dfd88>

例如,在这种情况下,我想 return 一个 Encycolpedia 实例(不是 Book 实例),而不会再次重载运算符 __add__使用 Encyclopedia 而不是 Book 我试过:

return self(self.name,(self.pages + other.pages))

但是没用。

如果 Class Enclcopedia 有另一个属性怎么办:

class Encyclopedia(Book):
    def __init__(self,name,pages,color):
        Book.__init__(self,name,pages)
        self.color=color

您可以使用 self.__class__ 而不是投射到 Book。您的原始添加函数应如下所示:

def __add__(self,other):
    return self.__class__(self.name,(self.pages + other.pages))

你需要做这样的事情,它会重载基础 class 的方法(在这种情况下,通常是先调用它们,然后对结果进行额外的处理——尽管这不是要求):

class Book(object):
    def __init__(self, name, pages):
        self.name = name
        self.pages = pages

    def __add__(self, other):
        return Book(self.name, self.pages+other.pages)

    def __str__(self):
        classname = self.__class__.__name__
        return '{}({}, {})'.format(classname, self.name, self.pages)

class Encyclopedia(Book):
    def __init__(self, name, pages, color):
        Book.__init__(self, name, pages)
        self.color = color

    def __add__(self, other):
        tmp = super(Encyclopedia, self).__add__(other)
        return Encyclopedia(tmp.name, tmp.pages, self.color+other.color)

    def __str__(self):
        classname = self.__class__.__name__
        return '{}({!r}, {}, {!r})'.format(classname, self.name, self.pages,
                                         self.color)


a = Encyclopedia('Omina', 234, 'grey')
b = Encyclopedia('Omnia2', 244, 'blue')
ab = a+b
print(ab)  # -> Encyclopedia('Omina', 478, 'greyblue')