0

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

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

def Test2():
 return test_p1()

提前致谢!

4

3 回答 3

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:模块级函数

用户@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,

(还有更多 - 以上只是关于非混淆命名)

于 2013-08-07T17:43:31.980 回答
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使它成为一种未绑定的方法,这会导致一些问题。

于 2013-08-07T18:06:28.757 回答
-1

您必须指定包含函数的类。打电话Test1.test_p1()

(在 python3 中有效,但在 2.x 中无效,因为关于绑定和未绑定的事物存在这种模糊性。)

也许您想对类使用大写字母,对函数使用小写字母。

更常见的情况如下:

您有一个定义方法的类:

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

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

spike = Animal ()
spike.bark ()
于 2013-08-07T17:38:16.687 回答