Python“;“受保护”;属性

Python“;“受保护”;属性,python,Python,如何从子类访问父类的私有属性(而不将其公开)?创建一个访问器方法,除非我缺少某些内容: def get_private_attrib(self): return self.__privateWhatever 如果变量名为“\uuu secret”,类名为“MyClass”,则可以在名为“var”的实例上这样访问它 变量.\u MyClass\u机密 建议/模拟保护的惯例是使用前导下划线命名:self.\u protected\u variable=10 当然,如果它真的需要,任何人都可以修

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

创建一个访问器方法,除非我缺少某些内容:

def get_private_attrib(self):
  return self.__privateWhatever
如果变量名为“\uuu secret”,类名为“MyClass”,则可以在名为“var”的实例上这样访问它

变量.\u MyClass\u机密

建议/模拟保护的惯例是使用前导下划线命名:self.\u protected\u variable=10


当然,如果它真的需要,任何人都可以修改它。

我对Python约定的理解是

  • _成员受到保护
  • __会员是私人会员
用于控制父类的选项

  • 让它受到保护,而不是隐私 因为这似乎是你真正想要的 想要
  • 使用getter(@property def _受保护的\u访问\u到\u成员…),以限制受保护的访问
如果你不能控制它

  • 撤消名称mangling。如果你 dir(object)您将看到名称 类似于"类"的成员, Python如何引导 “保密”。没有 在python中是真正私有的。这可能被认为是邪恶的

使用
@property
@name.setter
执行所需操作

e、 g

两种保护哲学 一些语言设计者同意以下假设:

“许多程序员不负责任、愚蠢,或者两者兼而有之。”

这些语言设计者会通过在他们的语言中引入
private
说明符来保护程序员免受彼此的攻击。 不久之后,他们认识到这通常过于死板,并引入了
保护

相比之下,Python的Guido van Rossum等语言设计师则认为程序员是负责任的成年人,并且具有良好的判断力(可能并不总是如此,但通常如此)。 他们发现,如果有必要,每个人都应该能够访问程序的元素,这样语言就不会妨碍做正确的事情。 (唯一能够可靠地阻止做错事的编程语言是语言)

因此,
\u myfield
在Python中的意思是“这个模块的设计者正在使用这个属性做一些不明显的事情,所以请不要修改它,如果可以的话,甚至不要阅读它——已经提供了访问相关信息的合适方法(或者我们希望如此)。”


如果您无法远离访问
\u myfield
(例如在子类中的特殊情况下),您只需访问它。

似乎没有人回答最初的问题

如何从子类访问父类的私有属性

下面是一个简单的用例,演示了两个选项—访问父类和使用:


我认为这个代码比Steve的代码更清晰。史蒂夫的回答对我正在努力做的事情非常有帮助,所以谢谢你!我用Python2.7和Python3.6对此进行了测试

#! /usr/bin/python
#
# From https://stackoverflow.com/questions/797771/python-protected-attributes
from __future__ import print_function
import sys

class Stock(object):

    def __init__(self, stockName):

        # '_' is just a convention and does nothing
        self.__stockName  = stockName   # private now


    @property # when you do Stock.name, it will call this function
    def name(self):
        print("In the getter, __stockName is %s" % self.__stockName, file=sys.stderr)
        return self.__stockName

    @name.setter # when you do Stock.name = x, it will call this function
    def name(self, name):
        print("In the setter, name is %s will become %s" % ( self.__stockName, name), file=sys.stderr)
        self.__stockName = name

if __name__ == "__main__":
    myStock = Stock("stock111")

    try:
        myStock.__stockName  # It is private. You can't access it.
    except AttributeError as a:
        print("As expect, raised AttributeError", str(a), file=sys.stderr )
    else:
        print("myStock.__stockName did did *not* raise an AttributeError exception")


    #Now you can myStock.name
    myStock.name = "Murphy"
    N = float(input("input to your stock: " + str(myStock.name)+" ? "))
    print("The value of %s is %s" % (myStock.name, N) )

你是说受保护的还是私人的?您的问题与标题不同…因为受保护和私有在Python中没有太大意义,请提供实际代码。问题是关于访问子类中的属性。我稍微修改了您的示例。看下面。你能相信吗@san,这个比喻已经有了?
class Family:

    def __init__(self, name):
        self.__family_name = name

    @property
    def name(self):
        return self.__family_name


class Child(Family):

    def __init__(self, first_name, last_name):
        super(Child, self).__init__(last_name)
        self.__child_name = first_name


    @property
    def name(self):
        return (self.__child_name, super(Child, self).name)


if __name__ == '__main__':
    my_child = Child("Albert", "Einstein")

    # print (my_child.__child_name)         # AttributeError - trying to access private attribute '__child_name'
    # print (my_child.__family_name)        # AttributeError - trying to access private attribute '__family_name'
    print (my_child._Child__child_name)     # Prints "Albert" - By accessing __child_name of Child sub-class
    print (my_child._Family__family_name)   # Prints "Einstein" - By accessing __family_name in Family super-class
    print (" ".join(my_child.name))         # Prints "Albert Einstein" - By using @property decorators in Child and Family 
#! /usr/bin/python
#
# From https://stackoverflow.com/questions/797771/python-protected-attributes
from __future__ import print_function
import sys

class Stock(object):

    def __init__(self, stockName):

        # '_' is just a convention and does nothing
        self.__stockName  = stockName   # private now


    @property # when you do Stock.name, it will call this function
    def name(self):
        print("In the getter, __stockName is %s" % self.__stockName, file=sys.stderr)
        return self.__stockName

    @name.setter # when you do Stock.name = x, it will call this function
    def name(self, name):
        print("In the setter, name is %s will become %s" % ( self.__stockName, name), file=sys.stderr)
        self.__stockName = name

if __name__ == "__main__":
    myStock = Stock("stock111")

    try:
        myStock.__stockName  # It is private. You can't access it.
    except AttributeError as a:
        print("As expect, raised AttributeError", str(a), file=sys.stderr )
    else:
        print("myStock.__stockName did did *not* raise an AttributeError exception")


    #Now you can myStock.name
    myStock.name = "Murphy"
    N = float(input("input to your stock: " + str(myStock.name)+" ? "))
    print("The value of %s is %s" % (myStock.name, N) )