gpt4 book ai didi

python - 如何复制 python 类属性?

转载 作者:行者123 更新时间:2023-12-01 05:44:11 25 4
gpt4 key购买 nike

为了发现 Python 作为一种语言的边界,我正在探索是否可以比使用前导下划线表示“私有(private)”实现细节的惯例更进一步地进行信息隐藏。

我已经成功地使用诸如此类的代码从本地定义的类复制“公共(public)”内容来实现字段和方法的某种额外级别的隐私:

from __future__ import print_function

class Dog(object):
def __init__(self):
class Guts(object):
def __init__(self):
self._dog_sound = "woof"
self._repeat = 1

def _make_sound(self):
for _ in range(self._repeat):
print(self._dog_sound)

def get_repeat(self):
return self._repeat

def set_repeat(self, value):
self._repeat = value

@property
def repeat(self):
return self._repeat

@repeat.setter
def repeat(self, value):
self._repeat = value

def speak(self):
self._make_sound()

guts = Guts()

# Make public methods
self.speak = guts.speak
self.set_repeat = guts.set_repeat
self.get_repeat = guts.get_repeat

dog = Dog()
print("Speak once:")
dog.speak()
print("Speak twice:")
dog.set_repeat(2)
dog.speak()

但是,我正在努力寻找一种方法来对属性 setter 和 getter 执行相同的操作。

我希望能够编写这样的代码:

print("Speak thrice:")
dog.repeat = 3
dog.speak()

并让它实际打印“woof”三次。

我已经在 Dog.__init__ 中尝试了以下所有操作,没有一个失败,但它们似乎也没有任何效果:

Dog.repeat = guts.repeat
self.repeat = guts.repeat
Dog.repeat = Guts.repeat
self.repeat = Guts.repeat
self.repeat = property(Guts.repeat.getter, Guts.repeat.setter)
self.repeat = property(Guts.repeat.fget, Guts.repeat.fset)

最佳答案

描述符仅在类上定义时才起作用,而在实例上则不起作用。请参阅this previous questionthis onethe documentation那个 abarnert 已经给你指出了。关键语句是:

For objects, the machinery is in object.__getattribute__() which transforms b.x into type(b).__dict__['x'].__get__(b, type(b)).

注意对type(b)的引用。整个类只有一个属性对象,访问时传入实例信息。

这意味着您不能在单个 Dog 实例上拥有仅处理该特定狗的内脏的属性。您必须在 Dog 上定义一个属性,并让它通过 self 访问单个狗的内脏。除非你不能通过你的设置来做到这一点,因为你没有在 self 上存储对狗内脏的引用,因为你试图隐藏内脏。

最重要的是,如果不在“面向外部”的对象上存储对该对象的引用,就无法有效地代理对底层“guts”对象的属性访问。如果您存储这样的引用,人们就可以使用它以“未经授权”的方式修改内容。

此外,遗憾的是,即使您现有的示例也不能真正保护胆量。我可以这样做:

>>> d = Dog()
>>> d.speak.__self__._repeat = 3
>>> d.speak()
woof
woof
woof

即使您尝试通过仅公开内脏的公共(public)方法来隐藏内脏,这些公共(public)方法本身也包含对实际内脏对象的引用,允许任何人潜入并直接修改内脏,绕过您的信息隐藏方案。这就是为什么尝试在 Python 中强制执行信息隐藏是徒劳的:该语言的核心部分(例如方法)已经暴露了很多东西,而您无法堵住所有这些泄漏。

关于python - 如何复制 python 类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16677915/

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