[英]How do I call a function from one class in another?
我很难理解如何从一个类调用另一个类的函数或方法。 换句话说,如何从Player
类的House
类中调用mailbox
功能,以便在我输入mailbox
时打印出字符串"There is an old mailbox"
?
class House(object):
def __init__(self, mailbox, door, vindov):
self.house = House()
self.mailbox = mailbox
self.door = door
self.vindov = vindov
def door(self):
print "There is nothjing special about this door"
def vindov(self):
print "The vindov seems to be half open"
def mailbox(self):
print "there is an old mailbox"
class Player(House):
while True:
action = raw_input("> ")
if action == "mailbox":
由于Player
从House
继承而来的,因此您可以通过self.mailbox()
从Player
内部的House
调用mailbox
方法。 您还可以通过super().<method name in super class>
来调用超类的方法。
>>> class A(object):
... def __init__(self, t):
... self.t = t
...
... def mailbox(self):
... print("This is an old mailbox")
>>> class B(A):
... def new_mailbox(self):
... self.mailbox()
...
...
...
>>> b = B("hello")
>>> b.new_mailbox()
This is an old mailbox
正如Games Brainiac指出的那样,您可以利用Player
类是House
类的子类这一事实来直接调用通过其名称调用的方法。 为此,首先必须在Player类中初始化超类House:
class Player(House):
def __init__(self):
House.__init__(self)
有了这个,你可以调用mailbox()
父类的方法House
直接self.mailbox()
但是,这暂时不起作用,因为在House
类内部存在名称空间冲突。 您self.mailbox()
这些方法分配与该类的属性相同的名称,因此,如果您尝试在Player类内部调用self.mailbox()
,则解释器将理解您正在尝试将字符串属性作为方法进行调用并引发以下错误: TypeError: 'NoneType' object is not callable
。 我建议您重命名这样的方法:
def doorMethod(self):
print("There is nothjing special about this door")
def vindovMethod(self):
print("The vindov seems to be half open")
def mailboxMethod(self):
print("there is an old mailbox")
现在,您可以在Player类内调用mailboxMethod()。 为此,建议不要使用while
循环,而是将此调用打包在另一个函数中,如下所示:
def mailboxQ(self):
action = input("> ")
if action == "mailbox":
self.mailbox()
现在,为了立即向用户提示问题,您应该在父class
House初始化之后立即在Player class
的__init__()
方法中调用该方法。
我还应该说您可能不想尝试在其内部初始化House class
的实例,因为这将导致您遇到RuntimeError: maximum recursion depth exceeded while calling a Python object
。 您调用尚未定义的对象;),因此从代码中删除以下行:
self.house = House()
这些更改将使您的代码现在可以正常运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.