Python的"protected"属性

15 浏览
0 Comments

Python的"protected"属性

如何在子类中访问父类的私有属性(而不将其设为公开)?

0
0 Comments

Python中的"protected"属性是指以双下划线(__)开头的属性,这种属性在类的外部是无法直接访问的。然而,有时候我们希望能够在子类中访问这些属性。下面是一个使用

和[apcode language="python"]
.setter

实现这一功能的示例代码:

class Stock(object):

def __init__(self, stockName):

self.__stockName = stockName # private now

def name(self):

return self.__stockName

@name.setter

def name(self, name):

self.__stockName = name

class SubStock(Stock):

def get_name(self):

return self._Stock__stockName

if __name__ == "__main__":

myStock = Stock("stock111")

print(myStock.name()) # 输出 stock111

myStock.name = "stock222"

print(myStock.name()) # 输出 stock222

subStock = SubStock("stock333")

print(subStock.get_name()) # 输出 stock333

[/apcode]

在这个例子中,我们定义了一个名为Stock的类,它有一个私有属性__stockName。我们通过定义一个名为name的方法来访问这个私有属性,并使用@property装饰器将它转化为一个getter方法。然后,我们使用@name.setter装饰器定义了一个name方法,用于修改私有属性的值。

接下来,我们定义了一个名为SubStock的子类,它继承自Stock类。在这个子类中,我们定义了一个名为get_name的方法,用于获取父类中的私有属性。

在主函数中,我们首先创建了一个Stock对象myStock,并通过调用name方法来获取私有属性的值。然后,我们通过给name方法赋值来修改私有属性的值,并再次调用name方法来验证修改是否成功。

最后,我们创建了一个SubStock对象subStock,并调用get_name方法来获取父类中的私有属性的值。

通过这种方式,我们可以在子类中访问父类中的"protected"属性,实现了对私有属性的间接访问。

0
0 Comments

Python的"protected"属性是指在属性名前加上一个下划线,如"_myfield"。Python的设计者Guido van Rossum认为程序员是负责任的成年人,具备良好的判断力,因此他们应该能够访问程序的元素,以便在有需要时能够进行正确的操作。他们认为语言不应该阻碍程序员做正确的事情。因此,在Python中,使用下划线作为前缀的属性意味着"模块的设计者正在对这个属性做一些不明显的操作,请不要修改它,如果可以的话甚至不要读它--已经提供了适当的访问方式(至少我们希望如此)。"

然而,如果在某些特殊情况下,无法避免访问"_myfield"(例如在子类中),那么仍然可以访问它。

这种保护属性的方式已经被比作宗教。有些语言设计者认为许多程序员不负责任或者愚蠢,因此他们倾向于通过在语言中引入"private"修饰符来保护程序员免受彼此的干扰。但是后来他们发现这种方式过于死板,于是又引入了"protected"修饰符。而像Python的设计者Guido van Rossum这样的语言设计者则认为程序员是负责任的成年人,具备良好的判断力。他们认为如果有需要,每个人都应该能够访问程序的元素,以便不妨碍做正确的事情。

Python的"protected"属性的出现原因是为了保护属性不被随意修改,同时提供合适的访问方式。解决方法是在属性名前加上下划线作为前缀,如果有特殊情况需要访问该属性,则仍然可以进行访问。

0
0 Comments

Python中的“protected”属性是指以一个下划线开头的属性,而“private”属性是指以双下划线开头的属性。如果你控制父类,有一些选项可以解决这个问题:可以将属性设置为protected而不是private,因为这似乎是你真正想要的;可以使用getter方法来限制对protected属性的访问。

如果你不能控制父类,可以撤销名称混淆。如果你使用dir(object)来查看对象的属性,你会看到类似于_Class__member的名称,这是Python用来将前导的双下划线“使其变为私有”的方法。在Python中,没有真正的私有属性。这种方法可能被认为是不好的。

需要注意的是,__前缀的目的不是使属性在“可见性”方面成为私有属性,而是在“继承性”方面成为私有属性,主要是为了在一个专门用于继承的类中避免命名冲突。正如评论中所指出的,名称混淆方案是明确定义和稳定的,所以如果有人真的想要访问(或更新)该属性,它不会阻止他们这样做。

0