如何在Python中使方法和数据成员成为私有的?或者Python不支持私有成员?
发布于 2017-02-04 03:44:44
这可能会起作用:
import sys, functools
def private(member):
@functools.wraps(member)
def wrapper(*function_args):
myself = member.__name__
caller = sys._getframe(1).f_code.co_name
if (not caller in dir(function_args[0]) and not caller is myself):
raise Exception("%s called by %s is private"%(myself,caller))
return member(*function_args)
return wrapper
class test:
def public_method(self):
print('public method called')
@private
def private_method(self):
print('private method called')
t = test()
t.public_method()
t.private_method()
发布于 2017-02-12 10:34:18
这是一种l-o-n-g的答案,但我认为它切中了真正问题的根源--可见性的范围。你只要坚持住,我就会吃力地解决这个问题!
简单地导入一个模块并不一定要让应用程序开发人员访问它的所有类或方法;如果我实际上看不到模块源代码,我怎么知道有什么可用呢?有些人(或某些东西)必须告诉我可以做什么,并解释如何使用那些我被允许使用的功能,否则整个事情对我来说是无用的。
那些通过导入的模块开发基于基础类和方法的高级抽象的开发人员使用规范文档呈现,而不是实际的源代码。
模块规范描述了客户端开发人员可见的所有功能。在处理大型项目和软件项目团队时,模块的实际实现应该始终对使用它的人隐藏--它是一个带有到外部世界的接口的黑匣子。对于OOD纯化论者,我认为技术术语是“解耦”和“一致性”。模块用户只需要知道接口方法,而不需要了解实现的细节。
如果不首先更改其底层规范文档,就不应该更改模块,这可能需要在某些组织中进行审查/批准,然后才能更改代码。
作为业余程序员(现在已经退休了),我开始了一个新的模块,规范文档实际上是写在模块顶部的一个巨大的注释块,这将是用户在规范库中实际看到的部分。由于只有我,我还没有建立一个库,但这将是很容易做到的。
然后,我开始编写各种类和方法,但没有函数体--只有" print ()“这样的null print语句--足以让模块编译时没有语法错误。当这一步完成后,我编译完成的null-module --这是我的规范。如果我在一个项目团队中工作,在继续充实正文之前,我会将这个规范/接口提交给审查和注释。
我一次一个地充实每个方法的主体,并进行相应的编译,确保语法错误立即得到即时修复。这也是开始在底部编写一个临时的“主”执行部分的好时机,以便在编写代码时测试每个方法。当编码/测试完成时,所有的测试代码都会被注释掉,直到您再次需要它时才需要更新。
在实际的开发团队中,spec注释块也会出现在文档控件库中,但那是另一回事了。重点是:作为模块客户,您只能看到此规范,而不能看到源代码。
PS:在时间开始之前很久,我在国防航空社区工作,我们做了一些很酷的事情,但是像专有算法和敏感的系统控制逻辑这样的东西被紧密地保护和加密在超级安全的软件库中。我们可以访问模块/包接口,但不能访问blackbox实现主体。有一个处理所有系统级设计、软件规格、源代码和测试记录的文档管理工具--它们都同步在一起。政府对软件质量保证标准有严格的要求。有人记得一种叫"Ada“的语言吗?这就是我的年龄!
发布于 2015-10-21 21:50:47
import inspect
class Number:
def __init__(self, value):
self.my_private = value
def set_private(self, value):
self.my_private = value
def __setattr__(self, my_private, value):
f = inspect.stack()[1][3]
if f not in ['__init__', 'set_private']:
raise Exception("can't access private member-my_private")
# the default behavior
self.__dict__[my_private] = value
def main():
n = Number(2)
print(n.my_private)
n.set_private(3)
print(n.my_private)
if __name__ == '__main__':
main()
https://stackoverflow.com/questions/2064202
复制相似问题