我怎么能让的方法和数据的成员的私人在蟒蛇?或者不Python支持私人的成员?

有帮助吗?

解决方案

  

9.6。私有变量

     

“私有”实例变量   不能被除从内部访问   一个对象,不要在Python存在。   然而,有一个惯例,就是   其次是最Python代码:名称   以下划线前缀(例如   _spam)应被视为该API的非公共部分(无论它   是一个函数,方法或数据   会员)。它应该被视为   实现细节和受   更改权利。

     

由于有一个有效的用例为   类的私有成员(即避免   名与名称的名称的冲突   由子类所定义的),有   这种机制支持有限,   叫名字改编。任何标识   形式__spam(至少两个的   领先的下划线,最多一个   尾随下划线)在文字上   与_classname__spam,其中更换   类名是当前的类名   剥去前导下划线(S)。   这种混淆不方面做得   到的语法位置   标识符,只要它发生   一个类的定义内。

所以,例如

class Test:
    def __private_symbol(self):
        pass
    def normal_symbol(self):
        pass

print dir(Test)

将输出:

['_Test__private_symbol', 
'__doc__', 
'__module__', 
'normal_symbol']

__private_symbol应被视为一个私有的方法,但它仍然是通过_Test__private_symbol访问。

其他提示

其他的答案提供的技术细节。我想强调的区别在理念之间的蟒蛇一方面和语言等C++/Java(其中我相信你熟悉基于你的问题)。

一般的态度在Python(和Perl于这一事项)是,"隐私"的属性是一个请求程序员,而不是一个铁丝网围栏的的编译/口译人员。这个想法是概述以及在 这个邮件 和通常被称为"我们都同意的成年人",因为它假设'这一程序是负责任,足以不要插手与内部。领先强调,作为一个礼貌的消息说,属性是内部的。

另一方面,如果你 希望访问内部对某些应用程序(一个显着的例子是文档的发电机等pydoc),你可以自由地这样做。责任是在你作为一个程序员知道你在做什么和做正确的,而不是语言来迫使你做的事情 它的 方式。

有没有 private 任何其它接入的保护机制在蟒蛇。有一个《公约》中记录了 蟒导风格 对于指明的用户类,它们不应被访问的某些属性。

  • _single_leading_underscore:弱"内部使用的"指标。E.g。 from M import * 不进口对象的姓名开始用下划线。

  • single_trailing_underscore_:使用由《公约》避免冲突与Python关键词,例如 Tkinter.Toplevel(master, class_='ClassName')

  • __双_领导_强调:当命名的类属性,调用名称重整的(内部流FooBar,__嘘变_FooBar__嘘;见下文)。

  

如果一个Python函数的名称,   类方法,或属性开头   (但不是结束)两大   强调,它是私有的; 一切   别人是公开的。 Python有没有概念   类方法保护(访问   只能在自己的类和子   类)。类方法或者是   私有(只能在自己的访问   类)或公有(   任意位置)。

深入Python

蟒蛇不会支持的隐私。程序员需要知道当它是安全的修改属性,但无论如何与蟒蛇就可以实现的东西喜欢私人用点小技巧。现在让我们看到一个人可以把任何东西的私有或没有。

class Person(object):

    def __priva(self):
        print "I am Private"

    def publ(self):
        print " I am public"

    def callpriva(self):
        self.__priva()

现在,当我们将执行:

>>> p = Person()
>>> p.publ()
 I am public
>>> p.__priva()
Traceback (most recent call last):
  File "", line 1, in 
    p.__priva()
AttributeError: 'Person' object has no attribute '__priva'
​#Explanation   : You can see  here we are not able to fetch that private method directly.
>>> p.callpriva()
I am Private
#​Explanation  : Here we can access private method inside class​

然后别人如何可以访问该变量???
你可以做像:

>>>p._Person__priva
I am Private

哇,实际上,如果蟒蛇是有得到任何变量开始与双强调是"翻译"通过加入一个单一的强调和类名称的开始:

注: 如果你不想要这个名称的改变但你仍然想要发送一个信号,用于其他目的离开,可以使用一个单一的最初强调的姓名,最初强调的不是进口与出演进口(从模块进口*)
例如:

#test.py
def hello():
    print "hello"
def _hello():
    print "Hello private"

#----------------------
#test2.py
from test import *
print hello()
print _hello()

输出-->

hello
Traceback (most recent call last):
  File "", line 1, in 
NameError: name '_hello' is not defined

现在,如果我们将呼叫_hello。

#test2.py
from test import _hello , hello
print hello()
print _hello()

输出-->

hello
hello private

最后:蟒蛇并不真正具有同等的隐私的支持,虽然单 和双初次强调,做到一定程度上给你两个等级的隐私

这可能工作:

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()

这是一个有点1-O-N-G的答案,但我认为它会在这里真正的问题的根源 - 可见范围。只是挂在那里,而我通过这个苦干!

简单地导入模块不必给所有它的类或方法的应用程序开发者的访问;如果我不能真正看到模块的源代码我怎么会知道什么是可用?有的一个(或一些东西)已经告诉我我可以做什么,并解释如何使用我允许使用这些功能,否则整个事情对我没用。

基于基本类和经由进口模块的方法的那些开发更高级别的抽象都带有一个规范文档 - 不是实际的源代码。

在模块规范描述了所有意在向客户端显影剂可见的特征。当大项目和软件项目团队打交道,一个模块的实际实施应该始终保持使用它,那些隐藏的 - 这是与对外部世界的接口,一个黑。对于OOD较真,我相信技术人员的术语是“脱钩”和“一致性”。该模块用户只需要知道而不与实现的细节负担接口的方法。

一个模块应该NEVER没有首先改变其基本规范文件被改变,这可能需要在之前改变代码一些组织审查/批准。

由于爱好编程(现已退休),我开始与实际写出的是在模块的顶部一个巨大的注释块的规范文档一个新的模块,这将是用户实际上是在规范库看到的部分。由于这只是我,我还没有建立一个图书馆,但它是很容易的事情。

然后我开始写的各种类和方法,但没有功能性机构编码 - 只是空的打印语句,如“打印()” - 就足以允许模块没有语法错误编译。当这个步骤完成我编译完成空模块 - 这是我的规格。如果我在一个团队中工作,我会充实身体在实施之前进行审查和评论该规范/接口。

我充实每一个方法的尸体在一个时间,并相应地编译,确保语法错误上即时立即固定。这也是在底部开始写一个临时的“主”执行部分测试每一个方法,你的代码的好时机。当编码/测试完成后,直到你需要再次更新应该成为所有必要的测试代码被注释掉了。

在真实世界的开发团队,规范的注释块将同时出现在一个文档控件库,但这是另一个故事。问题的关键是:你,作为模块的客户端,只看到该规范,而不是源代码

PS:很长的时间开始之前,我曾在国防航天社区,我们做了一些很酷的东西,但是东西像专有算法和敏感的系统控制逻辑是紧紧拱形和超级骗子安全软件库加密。我们必须访问模块/封装接口,但不是黑盒实施机构。有一个文件管理工具,它处理的所有系统级设计,软件规范,源代码和测试记录 - 这是所有一起同步。政府有严格要求的软件质量保证标准。任何人都还记得一个叫“艾达”的语言?这就是我老了!

我使用Python 2.7和3.5。我写这个代码:

class MyOBject(object):
    def __init__(self):
        self.__private_field = 10


my_object = MyOBject()
print(my_object.__private_field)

运行它,并得到:

  

AttributeError的: 'MYOBJECT' 对象没有属性 '__private_field'

请参阅: https://www.tutorialsteacher.com/python/私有和保护的访问修饰语合蟒

如果你想在Python私下方法或数据成员, 使用__setattr __

class Number:
    def __init__(self,value):
        self.my_private = value

    def __setattr__(self, my_private, value):
        # the default behavior
        # self.__dict__[my_private] = value
        raise Exception("can't access private member-my_private")


def main():
    n = Number(2)
    print(n.my_private)

if __name__ == '__main__': 
    main()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top