Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据python的约定,子类可以访问父类&x27;s名称以单个前导下划线“开头的变量”_&引用;?_Python_Oop - Fatal编程技术网

根据python的约定,子类可以访问父类&x27;s名称以单个前导下划线“开头的变量”_&引用;?

根据python的约定,子类可以访问父类&x27;s名称以单个前导下划线“开头的变量”_&引用;?,python,oop,Python,Oop,在python中,按照惯例,变量名称中的前导下划线(例如,\u var)表示该变量供内部使用。 然而,这个“内部”变量是否仍然可以被子类修改(按照约定) 换言之,\u var是私有的还是受保护的?单下划线表示按惯例“受保护的” 据 “Python规定了一种惯例,即在变量/方法的名称前加上单下划线或双下划线,以模拟受保护和私有访问说明符的行为。”有一些有用的信息 TL;DR::Python中没有真正的私有或受保护的修饰符。您可以将属性视为非公共属性,这是惯例,但不是严格强制执行的。通过在开始时使

在python中,按照惯例,变量名称中的前导下划线(例如,
\u var
)表示该变量供内部使用。 然而,这个“内部”变量是否仍然可以被子类修改(按照约定)

换言之,
\u var
是私有的还是受保护的?

单下划线表示按惯例“受保护的”

“Python规定了一种惯例,即在变量/方法的名称前加上单下划线或双下划线,以模拟受保护和私有访问说明符的行为。”

有一些有用的信息

TL;DR::Python中没有真正的私有或受保护的修饰符。您可以将属性视为非公共属性,这是惯例,但不是严格强制执行的。通过在开始时使用双下划线(例如:
\uu name
),属性可以隐藏得更深一些,但这有一些问题(/是有争议的?)。(见附注。)

来自PEP ocho:

仅对非公共方法和实例变量使用一个前导下划线。 为了避免与子类的名称冲突,请使用两个前导下划线来调用Python的名称混乱规则。Python将这些名称与类名相混淆:如果类Foo有一个名为_a的属性,那么Foo将无法访问它。(坚持使用的用户仍然可以通过调用Foo获得访问权限。_Foo__a。)通常,双前导下划线只能用于避免名称与设计为子类的类中的属性冲突。 注:关于_名称的使用存在一些争议(见下文)

然后,在此基础上:

如果你的类是要被子类化的,并且你有属性,你不想使用子类,考虑用双领先下划线命名它们,没有尾随下划线。这将调用Python的名称篡改算法,其中类的名称被篡改为属性名。如果子类无意中包含同名的属性,这有助于避免属性名称冲突

注意1:注意,只有简单的类名被用在损坏的名称中,所以如果一个子类同时选择了相同的类名和属性名,仍然可以得到名称冲突

注2:名称篡改可能会导致某些用途,例如调试和getattr(),不太方便。然而,名称篡改算法有很好的文档记录,并且易于手动执行

注3:并不是每个人都喜欢弄脏名字。尝试平衡避免意外名称冲突的需要与高级呼叫者的潜在使用


您仍然可以从子类访问这些属性,如果您这样做,大多数IDE将突出显示并发出警告,通常认为修改这些属性是不好的做法,但可以做到。nod。“不是一个公共界面,如果你对它的依赖导致某些东西崩溃,你可以保留这两部分”适用于阅读和写作。刚刚发现:“Python没有任何机制可以有效地限制对任何实例变量或方法的访问。Python规定了一种惯例,即在变量/方法的名称前加上单下划线或双下划线,以模拟受保护和私有访问说明符的行为。“从。基本上,它归结为文档。您可以记录
\u var
是否适合子类的作者使用,这取决于类使用它的确切目的。这不是完整的故事。前缀名称和受保护属性之间的关联是Python之外的人用来理解约定的东西,而不是Python文档本身所使用的东西。PEP-8只说该约定适用于“非公共”变量,而不区分受保护变量和私有变量。您是否建议每个项目对此应有自己的约定?我建议
\u var
不是类实例外部接口的一部分。无论您是否选择允许子类使用它,都应该在一个类一个类的基础上进行。除非另有说明,否则如果您认为它是禁止使用的,那么它最容易实现。