如何将整个类作为参数传递给另一个类的方法

时间:2013-04-18 21:10:38

标签: python

是否可以将整个类(不是实例)作为参数传递给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?

3 个答案:

答案 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