Python 中访问器方法的命名约定

Naming convention for accessor methods in Python

Q1:来自 OO 背景(Java、Ruby、Smalltalk),在 classes 中编写 classes 时命名访问器和修改器方法的首选方式是什么=31=]?例如,如果我有:

class Account :
    def __init__(self, owner) : 
        self.__owner = owner
        self.__amount = 0
    def owner(self) :
        return self.__owner

我是否应该在像 owner() 这样的属性名称之后调用我的访问器方法来访问私有属性 __owner,就像 Smalltalk 和 Ruby 等语言中的自定义一样,或者更确切地说调用它 get_owner 相当于你在 Java 中调用访问器的方式。我假设 Java 方式会更受欢迎?

Q2:关于 mutator 方法的类似问题:我应该将它们称为 set_owner à la Java 还是其他名称?

Q3:最后一个问题:如果我的属性是 public,如:

class Account :
    def __init__(self, owner) : 
        self.owner = owner
        self.amount = 0

我是否应该为它们编写访问器和修改器方法,因为无论如何我都可以从 class 外部访问和分配这些属性?

AFAIK 私有属性在 Python 中不像其他语言那样强调。每个属性都很容易访问,因此绕过“私有”属性的专用 getters/setters 主要是荣誉系统。所以这将是首选:

class Account :
    def __init__(self, owner) : 
        self.owner = owner
        self.amount = 0

a = Account("Kim")
a.owner
a.amount
a.owner = "Carol"
a.amount = 100

现在,人们提到了属性。这是一种使用 getter 和 setter 来“伪造”不存在的属性的方法,因此您仍然可以使用属性语法 x.y = z。它与 x.set_y(z) 的作用相同,因此如果您不关心这种审美,请不要使用属性;实例方法调用并不比属性访问少“Pythonic”。

Python 通常不使用属性来实现隐私。它们在 getters/setters 上用于动态计算值。单位换算就是一个很好的例子:

class Temperature:
    def __init__(self, Kelvin = 0.0):
        self.K = Kelvin
    
    @property
    def C(self):
        return self.K - 273.15
    
    @C.setter
    def C(self, Celsius):
        self.K = Celsius + 273.15

    @property
    def F(self):
        return self.C * 9/5 + 32
    
    @F.setter
    def F(self, Fahrenheit):
        self.C = (Fahrenheit - 32) * 5/9

因此,您不必将相同的温度存储在 3 个不同的单位中,而是将其存储在开尔文中,然后使用 getters/setters 获取摄氏度或华氏度。属性仅提供 temp.K, temp.C, temp.F 而不是 temp.K, temp.getC(), temp.getF().

的美学对称性