【发布时间】:2021-02-16 08:52:47
【问题描述】:
我想做的事情看起来很奇怪,简而言之,我正在尝试构建一个新类并从另一个类复制实例/静态/类方法而不进行继承(即,我只想要一个只有几个方法的类) .当我在网上查找时,似乎人们在建议我在插图中所做的(新类),但当我尝试测试它时,新类中声明的类方法似乎仍然指向前一个类(旧类)。
这就是我所做的:
class OldClass(object):
current_count = 1
def __init__(self):
pass
@classmethod
def method_class(cls):
cls.current_count += 1
def method_normal(self):
return 2
# new class
class NewClass(object):
method_class_copy = OldClass.method_class
method_normal_copy = OldClass.method_normal
检查 __self__ 给出以下结果:
class_self = getattr(NewClass.method_class_copy, '__self__', None)
print(class_self)
它返回:
<class '__main__.OldClass'>
但是在实例化后检查实例方法:
instance_self = getattr(NewClass().method_normal_copy, '__self__', None)
print(instance_self)
如您所见,它仍然指的是 OldClass,如果我运行类方法 NewClass.method_class_copy(),OldClass.current_count 将按照我定义的方式增加其值。
它返回:
<__main__.NewClass object at 0x000001D8CC1AEA88>
- 如何使用类方法的 __self__ 构造(新)类实际上是指 NewClass 而不是 OldClass?
- 为什么要“自动调整”实例方法?
谢谢
【问题讨论】:
-
“我想做的事情看起来很奇怪,简而言之,我正在尝试构建一个新类并从另一个类复制实例/静态/类方法而不进行继承” - 这不是一个明智的设计。如果您想在两个类之间共享一个方法实现而不让一个类继承另一个类,请将实现放在类之外的某个位置,例如在辅助函数或 mixin 中。
-
@user2357112 支持 Monica,新类将从任何给定的类对象动态创建。基本上,我想在类中使用选定的方法复制整个类,而不运行原始的初始化和创建过程。然后将新的类对象传递给其他函数以执行其他任务。
-
请注意,复制一个类是非常重要的,即使您了解如何将类从它们的各个部分拼凑在一起。您看到的行为是描述符,它是元类的小而简单的兄弟,实际上为类提供了动力。如果你真的想复制甚至拼凑一个课程,作为一个整体提出要求。如果您只想在其他类中重用方法,请关注结果的期望行为,而不是假定的复制方法。
标签: python class inheritance types