【问题标题】:Link between two functions in a different class不同类中的两个函数之间的链接
【发布时间】:2015-04-18 07:41:24
【问题描述】:

我是 Python 新手,正在尝试创建基于文本的冒险游戏,但遇到了一些问题。下面的代码是我目前卡住的表示。

class A(object):
   def funct1(self):
      pass
   def funct2(self):
      pass

class B(object):
   def funct1(self):
      pass

我试图从 B 类 funct1 链接到 A 类 funct2,但未成功。虽然我了解类的每个函数中的函数之间的联系(例如self.funct2()),但我仍然不清楚不同类中的函数之间的联系。

我尝试使用def __init__,但我不确定它在这种情况下如何应用。任何帮助将不胜感激!

【问题讨论】:

  • “链接”是什么意思?
  • 你的意思是继承吗?
  • 类似继承的东西,是的。但在这种情况下我不太确定,因为我不清楚哪一个是父母。我所说的链接的意思是,在我的游戏中,我计划让一个故事情节从一个转移到另一个。 B 类中的 def funct1 中的选项将导致 A 类中的 def funct2。

标签: python function class oop


【解决方案1】:

如果您想在 B 类中使用来自 A 的方法,则需要使用 inheritance

class A(object):
   def funct1(self):
      print("Hello from func1")

   def funct2(self):
      print("Hello from  func2")

class B(A):
    pass

b = B()
b.funct2()
b.funct1()
Hello from  func2
Hello from  func1

现在要调用类B中的继承方法,只需使用self.func1(), self.func2()..

如果您希望 func1 在类 B 中表现不同,您可以覆盖该方法:

class A(object):
   def funct1(self):
      print("Hello from A class func1")

   def funct2(self):
      print("Hello from A class func2")

class B(A):
    def funct1(self):
        print("overridden method")


b = B()
b.funct2()
b.funct1()

Hello from A class func2
overridden method

如果您希望您的实例具有名称属性,请在 __init__ 方法中创建该属性:

class A(object):
    def __init__(self, name):
        self.name = name

    def funct1(self):
      print("Hello from A class func1")

    def funct2(self):
      print("Hello from A class func2")

class B(A):
    def funct1(self):
        print("overridden method")


b = B("bar")  
print(b.name)
bar

在我提供的python-practice-book链接中有一个不错的类教程,建议你看看。

【讨论】:

    【解决方案2】:

    在 python 中访问其他类中的函数非常容易,您只需要声明 ClassName 。函数名() 这是一个例子:

    class A(object):
       def funct1(self):
          pass
       def funct2(self):
          pass
    
    class B(object):
       def funct1(self):
          pass
    B.funct1()
    

    类名.函数名(对象)

    【讨论】:

      【解决方案3】:

      希望我能理解您的问题。听起来您正试图从B.func1() 呼叫A.func1()。这个问题的问题是A 类没有关于B 的信息,除非您使用继承。

      您可以利用继承,但另一个解决方案是让 B.func1() 接受 A 的实例作为参数。

      以此类交互为例,请考虑会计与发票的交互方式。发票不会从会计师那里继承任何东西,反之亦然。会计需要做的就是拿发票并激活Pay方法。

      class Invoice():
          amount_due = 100
      
          def pay(self, payment_method):
              pass
      
      class Accountant():
          def pay_invoice(self, invoice, payment_method):
              if invoice.amount_due > 0:
                      invoice.pay(payment_method)
      

      Accountant 类不需要知道任何关于Invoice 类的信息,除了它有一个采用payment_methodPay 方法。 Invoice 类不关心谁支付,只要有人支付。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-26
        • 1970-01-01
        相关资源
        最近更新 更多