是否可以将整个类(不是实例)作为参数传递给Python中的另一个类方法?如果我首先有几个类的实例,并且需要传递它们中的任何一个而不指定哪个类到第二类的方法,我可以这样做:
class First():
def __init__(self, a, b):
pass
class Second():
def __init__(self, c, d):
pass
def method(self, First):
#and how do I call here the whole class First
#without calling a particular instance here?
答案 0 :(得分:3)
首先,您不需要在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)
我相信这回答了你真正的问题:
如果我首先有几个类的实例,并且需要传递它们中的任何一个而不指定哪个类的方法第二个...
如果你想确保参数实际上是First,你可以随时添加assert isinstance(first, First)
或if 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
内访问method
的类属性,就像在传递实例时访问实例属性一样容易。
答案 1 :(得分:2)
简单。
def method(self, First):
First() #instantiation
First.classmethod()
First.staticmethod()
在python类中是对象本身,因此您可以像这样调用method
second_instance.method(Any_Class_You_Want)
答案 2 :(得分:0)
您可以这样做:
class Model1:
def get():
return '1'
class Model2:
def get(Model1):
print('test: '+ str(Model1.get()))
if __name__ == '__main__':
Model2.get(Model1)
输出为:test: 1