如何访问另一个模块中的类中包含的函数

时间:2013-04-29 17:15:46

标签: python python-2.7

这应该相对简单,但我只是遗漏了一些东西。我正在尝试使用包含在类中的另一个模块的函数。当没有涉及课程时,我可以轻松完成。

# a.py
import b

b.name()

-

# b.py
def name():
    print "What is your name?"

class details(object):

    def age():
        print "What is your age?"

当我跑步时,我得到

的预期结果

你叫什么名字?

然而,当我尝试从另一个模块访问“def age()”时,它一直给我带来麻烦。

到目前为止,我尝试了一些......

# c.py
import b

b.details.age()

= TypeError:必须调用未绑定方法age(),并将详细信息实例作为第一个参数(没有任何内容)

# c.py
from b import details

details.age()

= TypeError:必须调用未绑定方法age(),并将详细信息实例作为第一个参数(没有任何内容)

# c.py
from b import details

b.details(age)

= NameError:名称'b'未定义

我也尝试过其他一些但是太多而不能合理地发布。我究竟做错了什么?这样做的语法是什么?当它包含在另一个模块的类中时,它甚至可以执行一个函数吗?

提前致谢

编辑:按照Mike Graham的建议将所有标签修复为空格

1 个答案:

答案 0 :(得分:1)

Python中所有类方法的第一个参数是对当前对象的引用(通常称为self)。但是,也就是说,您似乎尝试将其用作静态方法而不是实例方法,因此您可能想要使用the @staticmethod decorator

class Details: # class names in Python should generally be CamelCased.
   # please note the comments below
   @staticmethod
   def age():
       print 'What is your age?' 

或者,如果您真的希望它是一个实例方法,那么您需要添加self并更改您引用它的方式:

class Details:
   def age(self):
       print 'What is your age?' 

# c.py
from b import Details
#you must create an instance of the class before you can call methods on it.
d = Details() 
d.age()

修改

正如评论中所指出的,@staticmethod很少有真正的用例(例如,使用模块组织代码通常会更好)。您经常会遇到@classmethod作为替代方案。但请注意,用@classmethod修饰的方法将当前类作为第一个参数引用。 This question addresses the major differences.