为了发现 Python 作为一种语言的边界,我正在探索是否有可能比使用前导下划线表示“私有”实现细节的约定更进一步地隐藏信息。
我已经设法使用这样的代码从本地定义的类中复制“公共”内容,从而实现了字段和方法的一些额外级别的隐私:
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()
但是,我正在努力寻找一种方法来为属性设置器和获取器做同样的事情。
我希望能够编写这样的代码:
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)