【问题标题】:How to add method to base class?如何向基类添加方法?
【发布时间】:2023-02-01 01:19:19
【问题描述】:

我想将__add____radd__添加到python基类set

代码可以很简单

def __add__(self, other) :
    assert isinstance(other, set), \
        "perhaps additional type checking or argument validation can go here but" + \
        " strictly only defined for pure python sets"
    return set( list(self) + list(other) )

def __radd__(self, other) :
    assert isinstance(other, set), \
        "perhaps additional type checking or argument validation can go here but" + \
        " strictly only defined for pure sets"
    return set( list(other) + list(self) )

这个的 pythonic 实现是什么?如何在不创建自己的 MySet 类(将 set 作为父类)的情况下扩展基类?我可以只使用set.__add__ = some_function_I_defined吗?

【问题讨论】:

  • 什么基类?您是否自己创建了基类?
  • 您的意思是要将此行为添加到所有现有的 set() 实例吗?否则创建一个子类真的会更简单。
  • 一般来说,是的,你可以只将一个函数分配给一个新的类属性,但你不能像set那样将新的类属性添加到内置类中。
  • 不过,这是非常不标准的。尽管多组支持不同的并集和加法运算,这两个运算对于集合是等价的。只需使用 ||=,而不是让你的代码的未来读者想知道为什么你不是.
  • 尝试向任何类型的内置类或库类添加方法都是一个坏主意。相反,创建一个子类并将它们添加到其中。

标签: python class parent-child


【解决方案1】:

恕我直言,你应该做的是对内置的set 类进行子类化。 在 Python 中(与 Ruby 或 JavaScript 相反)猴子修补内置是不允许的。

所以例如试图添加一个不存在的方法:

x = [1,2,3]
x.my_new_method_added_in_runtime = lambda: "whatever"

是行不通的,你会得到AttributeError: 'list' object has no attribute 'my_new_method_added_in_runtime'

您也不能修改使用这些内置函数实例化的对象的现有方法:

x = [1,2,3]
x.sort = lambda: "returning some string instead of sorting..."

将导致AttributeError: 'list' object attribute 'sort' is read-only

list.append = None
# OR
del list.append

将导致: TypeError: can't set attributes of built-in/extension type 'list'

以上所有内容都适用于set 等等。

您可以尝试寻找一些库来实现这一目标,例如https://pypi.org/project/forbiddenfruit/0.1.0/,但它是强烈地灰心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2011-05-23
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多