首先,您不需要在 Python 中指定类型。所以,如果你想method
举个First
例子,只需这样做:
class Second():
def __init__(self, c, d):
pass
def method(self, first):
pass
my_first = First(0, 1)
my_second = Second(2, 3)
my_second.method(my_first)
我相信这回答了您真正的问题,即:
如果我首先有几个该类的实例,并且需要将其中的任何一个传递给第二类的方法,但没有指定哪个实例......</p>
如果您想确保参数实际上是 First,您始终可以添加assert isinstance(first, First)
orif not isinstance(first, First): raise TypeError
或其他任何内容,但通常您不想在 Python 中这样做。“鸭子打字”的全部意义在于您编写了一个接受“任何像First
实例一样的东西”的函数,而不是一个接受“First
实例”的函数。
然后你说:
现在我需要在第二个类的方法中对 First 类的变量进行变异:
所以……就去做吧。您的示例在类中没有任何属性First
,所以让我们添加一些:
class First():
def __init__(self, a, b):
self.total = a + b
现在,让我们使用它们Second.method
:
class Second():
def __init__(self, c, d):
self.total = c + d
def method(self, first):
first.total += self.total
所以:
>>> my_first = First(0, 1)
>>> my_first.total
1
>>> my_second = Second(2, 3)
>>> my_second.total
5
>>> my_first.total += 2
>>> my_first.total
3
>>> my_second.method(my_first)
>>> my_first.total
8
或者,如果你的意思是你想改变类中的类属性First
……你甚至不需要一个First
实例:
First.my_class_attribute = 1
如果你真的需要传递一个类本身......好吧,一个类就像其他任何东西一样是一个常规值:
class Second():
def __init__(self, c, d):
pass
def method(self, cls):
pass
my_second = Second(1, 2)
my_second.method(First)
cls
并且您可以访问from within的类属性method
,就像在传递实例时访问实例属性一样容易。