我是猴子修补类的__eq__
方法。我发现以下作品:
def eq(obj, other):
if isinstance(other, str):
return obj.name.upper() == other.upper()
else:
return object.__eq__(obj, other)
这不起作用:
def eq(obj, other):
if isinstance(other, str):
return obj.name.upper() == other.upper()
else:
return super().__eq__(other)
这有时可行,但有时会引发错误:
def eq(obj, other):
if isinstance(other, str):
return obj.name.upper() == other.upper()
else:
return super().__eq__(self, other)
错误:
<ipython-input-128-91287536205d> in eq(obj, other)
3 return obj.name.upper() == other.upper()
4 else:
----> 5 return super().__eq__(self, other)
6
7
RuntimeError: super(): __class__ cell not found
您能解释一下发生了什么吗?如何用object
正确替换super()
?
参考方案
在类外部定义的函数中,不能在没有参数的情况下使用super()
。 __class__
单元格super()
所依赖的元素仅提供给class
主体中定义的功能。从super()
documentation:
零参数形式仅在类定义内起作用,因为编译器会填写必要的详细信息以正确检索要定义的类,以及为常规方法访问当前实例。
使用2参数形式,明确命名该类:
def eq(obj, other):
if isinstance(other, str):
return obj.name.upper() == other.upper()
else:
return super(ClassYouPutThisOn, obj).__eq__(other)
ClassYouPutThisOn.__eq__ = eq
这要求您在猴子补丁中显式命名该类,从而使其对重用的用处不大。
相反,您可以通过将__class__
嵌套在另一个以eq
作为本地名称的函数中来手动提供所需的__class__
单元格:
def patch_eq(cls):
__class__ = cls # provide closure cell for super()
def eq(obj, other):
if isinstance(other, str):
return obj.name.upper() == other.upper()
else:
return super().__eq__(other)
cls.__eq__ = eq
super()
通过从调用框架获取第一个本地名称来查找第二个参数(对实例的引用)(即,传递到函数调用中的第一个参数,通常称为self
)。
另请参见Why is Python 3.x's super() magic?
使用嵌套函数方法的演示:
>>> class Foo:
... name = 'bar'
... def __eq__(self, other):
... return False
...
>>> Foo() == 'Bar'
False
>>> Foo() == Foo()
False
>>> patch_eq(Foo)
>>> Foo() == 'Bar'
True
>>> Foo() == Foo()
False
如果django模型已经具有相关的类,如何将其转换为抽象模型 - python可以说我有以下基本模型:class human(models.Model): gender = models.BooleanField() age = models.IntegerField() name = models.CharField(max_length=200) 还有两个继承它的模型:class superhero(human): can_fly…
Python sqlite3数据库已锁定 - python我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…
python-构造函数中的另一个类 - java我是Python的新手,我很难理解如何在Python中执行以下操作(例如,在Java中的操作方式)class Person{ private String name; private Address address; public Person(String xyz, Address a) { this.name = xyz; this.address = …
Python:传递记录器是个好主意吗? - python我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…
Python-Excel导出 - python我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…