如何定义方法,以便 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')
我正在尝试重载运算符,强制它 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')