gpt4 book ai didi

python - 在 python 子类中将方法设为私有(private)

转载 作者:IT老高 更新时间:2023-10-28 22:19:32 25 4
gpt4 key购买 nike

是否可以在子类中将公共(public)方法设为私有(private)?我不希望扩展这个类的其他类能够调用某些方法。这是一个例子:

class A:
def __init__(self):
#do something here

def method(self):
#some code here

class B(A):
def __init__(self):
A.__init__(self)
#additional initialization goes here

def method(self):
#this overrides the method ( and possibly make it private here )

从现在开始,我不希望任何从 B 扩展的类能够调用 method。这可能吗?

编辑:这样做的“逻辑”原因是我不希望用户以错误的顺序调用方法。

最佳答案

与此主题的流行时尚相反,有合理的理由区分公共(public)、私有(private)和 protected 成员,无论您是在 Python 还是更传统的 OOP 环境中工作。很多时候,您会在某种对象特化水平上为特别冗长的任务开发辅助方法。不用说,您真的不希望任何子类继承这些方法,因为它们在专门的上下文中没有意义,甚至不应该是可见的;然而它们是可见的,它们减少了诸如标签补全、对象导航器和其他系统软件之类的东西的实用性,因为所有不同抽象级别的东西都被扁平化并组合在一起。请注意,这些编程辅助工具并非微不足道。如果您是一名学生并且仅仅因为您正在学习如何做一百万次,那么它们只是微不足道的。

Python 在历史上的发展方式是,由于意识形态惯性和兼容性问题,实现公有/私有(private)区分变得越来越困难。这是显而易见的事实。改变他们一直在做的事情对每个人来说都是一件非常头疼的事情。因此,我们现在有一百万的 Python 粉丝,他们都读过相同的一两篇原创文章,明确地认为公共(public)/私有(private)的区别是“非 Python 的”。这些人,由于缺乏批判性思维或对广泛的普遍做法的公平性,立即利用这个机会来积累大量可预测的辩护词——De Defensione Serpentis——我怀疑这不是来自理性选择via pythonis(pythonic的方式),而忽略了其他语言,要么选择不使用,要么不熟练使用,要么因为工作而无法使用。

正如有人已经说过的,在 Python 中产生类似于私有(private)方法的效果的最好方法是在方法名称前加上 __(两个下划线)。另一方面,实际上这样做的唯一一件事就是在对象的 __dict__ 中插入一个变形的属性名称。例如,假设您有以下类定义:

class Dog(object):
def __bark(self):
print 'woof'

如果你运行dir(Dog()),你会看到一个奇怪的成员,叫做_Dog__bark。事实上,这个技巧存在的唯一原因是为了规避我之前描述的问题:即防止继承、重载和替换 super 方法。

希望将来会有一些私有(private)方法的标准化实现,当人们意识到组织不需要使用单个细胞复制 DNA 的方法时,有意识的头脑需要不断地弄清楚如何修复它的组织和内脏。

关于python - 在 python 子类中将方法设为私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/451963/

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