Python中的非成员与成员函数

Jim*_*Joo 19 python encapsulation member-functions non-member-functions

我对Python比较陌生,并且努力将语言的特性与我从C++和Java背景中学到的习惯相协调.

我最近的问题与封装有关,特别是Meyer的" Effective C++ " 第23项总结的一个想法:

首选非成员非友元函数到成员函数.

friend暂时忽略缺少机制,非成员函数也被认为优于Python中的成员函数吗?

一个强制的,asinine的例子:

class Vector(object):
    def __init__(self, dX, dY):
        self.dX = dX
        self.dY = dY

    def __str__(self):
        return "->(" + str(self.dX) + ", " + str(self.dY) + ")"

    def scale(self, scalar):
        self.dX *= scalar
        self.dY *= scalar

def scale(vector, scalar):
    vector.dX *= scalar
    vector.dY *= scalar
Run Code Online (Sandbox Code Playgroud)

鉴于v = Vector(10, 20),我们现在可以调用v.scale(2)scale(v, 2)加倍向量的大小.

考虑到我们在这种情况下使用属性的事实,两个选项中的哪一个 - 如果有的话 - 更好,为什么?

Dan*_*man 17

有趣的问题.

你从一个不同的地方开始,而不是来自Java程序员的大多数问题,这些问题往往假设你在大多数时候都不需要课程.通常,在Python中,除非您专门进行数据封装,否则没有必要使用类.

当然,在你的例子中,你实际上是这样做的,因此使用类是合理的.就个人而言,我会说,既然你有一个类,则该成员函数是最好的方式去:你具体做在那个特定的载体实例的操作,因此是很有意义的功能是一种方法上向量.

您可能希望将其作为独立函数(我们实际上并未使用"成员"或"非成员"一词),如果您需要使其可以使用多个类,这些类不必相互继承或共同的基础.感谢duck-typing,这是很常见的做法:指定你的函数需要一个具有特定属性或方法集的对象,并对它们做些什么.

  • 虽然我们在这里,有点相关的注意事项 - 与C++的不同之处在于Python没有"public"或"private"的概念.`_underscore`语法是提供*提示*的传统方式,即某些东西是私有的,但它不是*强制执行*. (3认同)