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,这是很常见的做法:指定你的函数需要一个具有特定属性或方法集的对象,并对它们做些什么.