gpt4 book ai didi

python - Python中的非成员与成员函数

转载 作者:IT老高 更新时间:2023-10-28 21:01:34 30 4
gpt4 key购买 nike

我对 Python 比较陌生,并且努力协调该语言的特性与我从 C++ 和 Java 背景中养成的习惯。

我遇到的最新问题与封装有关,特别是 Meyer 的“Effective C++”的第 23 条最好地总结了一个想法:

Prefer non-member non-friend functions to member functions.

暂时忽略 friend 机制的缺失,在 Python 中,非成员函数是否也被认为比成员函数更可取

一个强制性的,愚蠢的例子:

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

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

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

最佳答案

有趣的问题。

您的出发点与 Java 程序员提出的大多数问题不同,Java 程序员往往认为您需要类,而实际上您并不需要。通常,在 Python 中,除非您专门进行数据封装,否则使用类是没有意义的。

当然,在您的示例中,您实际上正在这样做,因此使用类是合理的。就个人而言,我会说,既然你确实有一个类,那么成员函数是最好的方法:你专门对那个特定的向量实例进行操作,所以它对将函数作为 Vector 上的方法。

如果您需要使其与多个不一定继承自彼此或共同的基础。多亏了鸭子类型,这样做是相当普遍的做法:指定您的函数需要一个具有一组特定属性或方法的对象,然后对它们做一些事情。

关于python - Python中的非成员与成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10072204/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com