【发布时间】: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.Fraction和fractions.Decimal。有一个模块级函数fractions.gcd,它接受fractions.Fraction类的两个对象并找到它们的最大公约数。 -
@juanpa.arrivillaga 啊我明白了!我在同一个模块中混合了多个没有过度相关的类,这就是为什么把东西放在一个类之外感觉不结构化的原因。但是,我可以看到将其拆分为不同的模块将如何帮助我保持清晰。谢谢你的例子!
标签: python function class decorator static-methods