0

这应该相对简单,但我只是错过了一些东西。我正在尝试利用另一个模块中包含在一个类中的函数。当不涉及课程时,我可以轻松地做到这一点。

# 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?"

当我运行 ai 得到预期的结果

你叫什么名字?

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

到目前为止我尝试过的一些...

# c.py
import b

b.details.age()

= TypeError: unbound method age() must be called with details instance 作为第一个参数(什么都没有)

# c.py
from b import details

details.age()

= TypeError: unbound method age() must be called with details instance 作为第一个参数(什么都没有)

# c.py
from b import details

b.details(age)

= NameError: name 'b' 未定义

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

提前致谢

编辑:按照 Mike Graham 的建议将所有选项卡修复为空格

4

1 回答 1

1

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

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将当前类的引用作为第一个参数。这个问题解决了主要差异。

于 2013-04-29T17:20:11.863 回答