Python 在实例之间以不同方式定义相同方法的正确方法

Python 在实例之间以不同方式定义相同方法的正确方法,python,class,methods,instance,Python,Class,Methods,Instance,我正在尝试用Python创建一个类,它的方法在不同的实例之间定义不同(使用相同的名称)。创建实例时,不同的定义可能基于类的输入 例如: Class A: def __init__(self, a): ... def foo(self): ... a1 = A(input1) a2 = A(input2) a1.foo() a2.foo() 我希望这两个实例的foo()定义不同。我可以将此逻辑编码到foo方法中,但我想知道是否有更干净或

我正在尝试用Python创建一个类,它的方法在不同的实例之间定义不同(使用相同的名称)。创建实例时,不同的定义可能基于类的输入

例如:

Class A:
     def __init__(self, a):
         ...

     def foo(self):
         ...

a1 = A(input1)
a2 = A(input2)
a1.foo()
a2.foo()
我希望这两个实例的
foo()
定义不同。我可以将此逻辑编码到
foo
方法中,但我想知道是否有更干净或更具python风格的方法来实现这一点。 谢谢

我希望这两个实例的foo()定义不同

你真的不想那样。我无法想象这将导致的调试噩梦

如果
a1.foo
a2.foo
不同,则表示
a1
a2
不应是同一类的实例

使用子类并在每个类中实现
foo
(视情况而定):

Class Common:
    # common stuff
    ...

Class A1(Common):
    def foo(self):
        print('a1.foo')

Class A2(Common):
    def foo(self):
        print('a2.foo')

a1 = A1()
a2 = A2()
a1.foo()
# 'a1.foo'
a2.foo()
# 'a2.foo'

你不能那样做。但您始终可以动态地向对象添加自定义属性

class A:
    def __init__(self, x):
        self.x = x

a1 = A()
a2 = A()

def foo1():
    # you can't use self.x
    print("a1")

a1.foo = foo1
a2.foo = lambda : print("a2")

a1.foo() # a1
a2.foo() # a2
但这不是一个好的做法,使用它的风险自负


此外,正如评论中所指出的,您没有访问实例属性的权限(因为没有隐式的
self
参数)。

您试图用这种有问题的技术实现什么?您的示例没有任何帮助。我有一种对象渲染方法,在不同的对象之间工作非常不同(实例)。我不想创建一个复杂的方法来检查实例并应用特定的呈现逻辑,而是想知道是否可以通过基于实例本身的同一方法的多个定义来实现。如果每个实例的代码不同,那么在创建实例时将其作为回调传递可能是有意义的。
a(a,一些函数)
仅仅因为你可以做一件事并不意味着你应该做。我不知道我可以动态地向实例添加方法。谢谢。你将如何从lambda中访问实例属性?在我的情况下,将其划分为子类有点混乱,但似乎是正确的解决方案。请注意,谢谢。@bdemin一点也不混乱,尤其是与其他备选方案相比。这是一个很好的解决方案,如果将其与方法结合起来,可能会完全满足您的需要。您可以将
input1
input2
传递到
Common.\uu init\uuu()
它将根据此输入返回A1或A2对象。然后,您可以使用它们,就像它们是同一类一样,因为它们具有相同的接口。这是解决我的问题的一个很好的方法。谢谢@mattrea6!