【问题标题】:How to create a method for a class that takes multiple objects of a class as arguments?如何为将类的多个对象作为参数的类创建方法?
【发布时间】:2017-06-22 19:50:44
【问题描述】:

我想在一个类定义一个特殊方法,该方法将类的两个实例作为参数。我还希望能够使用 method(object_a, object_b) 而不是 object_a.method(object_b) 调用此函数。我举个例子来说明:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def inside_class_age_diff(self, other):
        return abs(self.age - other.age)


def outside_class_age_diff(person_a, person_b):
    return abs(person_a.age - person_b.age)

Romeo = Person("Romeo", 20)
Juliet = Person("Juliet", 18)
print(Romeo.inside_class_age_diff(Juliet))
print(outside_class_age_diff(Romeo, Juliet))

所以,在上面的示例中,outside_class_age_diff() 将类 Person 的两个对象作为参数,但它是在类之外定义的,我觉得这是错误的,因为它显然是属于类 Person 的方法.另一方面,即使inside_class_age_diff() 是在类内部定义的,它也需要使用带有类的对象的点表示法来调用,这不是很整洁。

那么,我怎样才能让inside_class_age_diff(Romeo, Juliet) 工作?有可能吗?

【问题讨论】:

  • 但是为什么它属于类呢?对我来说,这似乎是一个非常合理的模块级函数。
  • @juanpa.arrivillaga - 如果另一个程序员查看我的代码并想要使用该类,那么肯定会更容易看到我的类提供了该方法,如果它是在同一个类中定义的。我认为它为代码增加了结构。
  • 为什么不用模块?模块用于为您的代码添加结构。而这些接受函数中定义的类对象的函数是许多python模块的典型特征。以标准库模块fractions 为例。该模块有两个类,fractions.Fractionfractions.Decimal。有一个模块级函数fractions.gcd,它接受fractions.Fraction 类的两个对象并找到它们的最大公约数。
  • @juanpa.arrivillaga 啊我明白了!我在同一个模块中混合了多个没有过度相关的类,这就是为什么把东西放在一个类之外感觉不结构化的原因。但是,我可以看到将其拆分为不同的模块将如何帮助我保持清晰。谢谢你的例子!

标签: python function class decorator static-methods


【解决方案1】:

您似乎在玩弄设计模式。你要找的是static method

你可以这样定义它:

class Person:
    def __init__(self, name, age):
        ...

    def inside_class_age_diff(self, other):
        ...

    @staticmethod
    def outside_class_age_diff(person_a, person_b):
        return abs(person_a.age - person_b.age)

然后你可以像这样使用它:

Person.inside_class_age_diff(Romeo, Juliet)

它仍然是类的方法,因此需要这样调用。

【讨论】:

  • 我使用带有print(outside_class_age_diff(Romeo, Juliet)) 的代码得到NameError: name 'outside_class_age_diff' is not defined。对你起作用吗? :(
  • @blueprince13,您需要将其称为Person.outside_class_age_diff(Romeo, Juliet)。还是类的方法,所以需要这样调用。
  • 知道了!现在可以了,这就是我想要的。 :) 您能否将其添加到您的答案中,以供其他可能偶然发现此问题的人使用?
【解决方案2】:

你可以使用静态方法:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @staticmethod    
    def inside_class_age_diff(person_a, person_b):
        return abs(person_a.age - person_b.age)



Romeo = Person("Romeo", 20)
Juliet = Person("Juliet", 18)
print(Romeo.inside_class_age_diff(Romeo, Juliet))

静态方法的行为就像普通函数一样,即它不绑定到实例。因此,第一个参数不会以任何方式进行特殊处理。

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2015-10-09
    • 2022-01-25
    相关资源
    最近更新 更多