如何在python 3.3中的另一个类中返回一个函数

时间:2013-08-07 17:34:16

标签: python function

我知道这是一个非常糟糕的描述,但我怎样才能让它发挥作用:

class Test1():
 def test_p1():
    print("This is part 1 of Test1")

def Test2():
 return test_p1()

提前致谢!

3 个答案:

答案 0 :(得分:5)

嗯,有几种选择。

最基本的是:

首先创建实例

class Test1():
    def test_p1(self):
        print("This is part 1 of Test1")

def Test2():
    return Test1().test_p1()

但是,当新实例有意义时(取决于您的API),您应该使用它。

使它成为类方法

class Test1():
    @classmethod
    def test_p1(cls):
        print("This is part 1 of Test1")

def Test2():
    return Test1.test_p1()

使其成为静态方法(不鼓励)

class Test1():
    @staticmethod
    def test_p1():
        print("This is part 1 of Test1")

def Test2():
    return Test1.test_p1()

替代方案:使用继承

在某些情况下(也许是你的情况,我们也不知道)实际利用继承是有意义的:创建一个将继承自Test1的类。这样,您可以覆盖它的一部分并引用父方法。例如:

class Test1():
    def test_p1(self):
        print("This is part 1 of Test1")

class SomeOtherClass(Test1):
    def test2(self):
        return super(SomeOtherClass, self).test_p1()

然后像这样使用它:

my_instance = SomeOtherClass()
result = my_instance.test2()

但同样,它实际上取决于您的API /库。

备选方案2:模块级功能

User @ user2357112正确地指出,模块级功能可以更好(更简单)的想法:

def test_p1():
    print("This is part 1 of Test1")

def Test2():
    return test_p1()

旁注:PEP8

为了避免混淆,因为Python非常动态,你应该提供一个"提示"开发人员使用的是什么,并且通常遵循PEP8中定义的编码风格:

  • 模块名称为all_lower_case
  • 功能和方法也是all_lower_case
  • 类是CamelCase(同样适用于返回类实例的类似工厂的函数),
  • 常量为ALL_UPPER_CASE
  • 对象属性为all_lower_case

(以及更多 - 以上仅涉及非混淆命名)

答案 1 :(得分:0)

Tadeck在我打字时给出了详细的答案,但这是我对你认为你想要完成的事情的初步解决方案。我正在添加我的输入只是因为我是Python的新手,我认为初学者的观点可能对OP有益。

class Test1():
    def test_p1(self):
    print "This is part 1 of Test1"

def Test2():
    myTest = Test1()
    return myTest.test_p1()

Test2()

在原始代码中,您尝试在不实例化test_p1类的情况下调用Test1方法。所以我先做了myTest = Test1(),然后使用我新创建的test_p1()对象调用myTest方法。

另外,我在self方法的参数列表中添加了test_p1。我并不完全理解为什么,但显然缺少self会使它成为一种无约束的方法,会导致一些问题。

答案 2 :(得分:-1)

您必须指定包含功能的类。致电Test1.test_p1()

(在python3中工作,但不在2.x中,因为有关于绑定和未绑定内容的这种模糊。)

也许你会想要使用大写字母来表示函数的类和小写。

更常见的情况如下:

您有一个定义方法的类:

class Animal:
    def bark (self): print ('woof')

然后在其他地方你实例化这个类的对象,然后调用实例的方法:

spike = Animal ()
spike.bark ()