【问题标题】:What are the main advantages of using a class over a callable function?使用类而不是可调用函数的主要优点是什么?
【发布时间】:2014-05-12 01:33:06
【问题描述】:

今天我想知道类比可调用函数有什么优势。我知道这似乎是一个奇怪的问题,但我正在编写一个基于太空的游戏,我想做一些显示生命支持的东西(氧气、氮气) 基本上,我有这个功能:

oxygen = 100
nitrogen = 100
air = [oxygen, nitrogen]
print("You can use check(air) to see the quantities of n2 and o2 available.")
def check(variable):
    if variable == air:
    print("Your oxygen level is {0}% and your nitrogen level is {1}%.".format(oxygen, nitrogen))

因此,每当玩家键入 check(air) 时,他们都可以看到飞船中的氮气和氧气含量。使用它,我还可以让他们通过扩展 check() 函数来查看其他函数。我想知道为游戏这样做是否比这样做更好:

class Lifesupport(object):
    def __init__(self, oxygen, nitrogen):
        self.oxygen = oxygen
        self.nitrogen = nitrogen

air = Lifesupport(40, 60)
#This part is for checking functionality
print("Your air has {0}% oxygen and {1}% nitrogen".format(air.oxygen, air.nitrogen))

就个人而言,我更喜欢该功能,尽管我真的不知道哪个更好用于此目的。我知道你可以输入 air.oxygen 来查看氧气水平,我可能会使用 check() 函数来单独打印一个类“bundle”,比如 'air'.."

基本上...与我展示的代码这样的函数相比,使用类的真正优势是什么?出于我的目的,使用类或函数或两者都更好吗?

【问题讨论】:

    标签: python function class python-3.x


    【解决方案1】:

    要打印氧气和氮气,您可以:

    class Lifesupport(object):
        def __init__(self, oxygen, nitrogen):
            self.oxygen = oxygen
            self.nitrogen = nitrogen
        def __str__(self):
            return "Your air has {0}% oxygen and {1}% nitrogen".format(self.oxygen, self.nitrogen)
    

    然后,当您想要显示Lifesupport 级别时,您只需执行以下操作:

    air = Lifesupport(40, 60)
    print(air)
    

    __str__ 方法会覆盖类的默认 __str__ 方法,因此当您执行 print(air) 时,它将打印自定义文本。

    对于类与方法,建议您使用类,尤其是当您知道将要扩展您的程序时,因为您可以创建一个类的多个实例,这些实例都具有可以独立修改的属性彼此的。下面是一个例子:

    示例

    class A:
        def __init__(self,num):
            self.val = num
    
    a = A(4)
    b = A(5)
    
    >>> print(a.val)
    4
    >>> a.val = 6
    >>> print(a.val)
    6
    >>> print(b.val)
    5
    

    【讨论】:

    • 有趣..我会玩一会儿。
    【解决方案2】:

    类是一个实例工厂。您可以创建多个类的实例(即副本)自定义并根据您的需要进行扩展(通过继承和重载方法)。

    如果您想重用或自定义已经编写的函数,那么在类中使用它是可行的。如果您还没有这样做,我建议您通过课程编码基础来下定决心。一个简单的例子可以是

    class Person:
        def __init__(self, name, job=None, pay=0):
            self.name = name
            self.job = job
            self.pay = pay
    
        def giveRaise(self, percent):
            self.pay = int(self.pay * (1 + percent))
    
    class Manager(Person):
         def __init__(self, name, pay):            # Redefine constructor
                Person.__init__(self, name, 'mgr', pay) # Run original with 'mgr'
         def giveRaise(self, percent, bonus=.10):
                Person.giveRaise(self, percent + bonus)
    

    我正在通过继承原始类并在管理器类中添加新信息来自定义原始类的“init”方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2011-07-10
      • 2010-09-15
      • 1970-01-01
      相关资源
      最近更新 更多