回答(11)

2 years ago

python中的私有变量或多或少是一个hack:解释器故意重命名变量 .

class A:

def __init__(self):

self.__var = 123

def printVar(self):

print self.__var

现在,如果您尝试在类定义之外访问 __var ,它将失败:

>>>x = A()

>>>x.__var # this will return error: "A has no attribute __var"

>>>x.printVar() # this gives back 123

但你可以很容易地逃脱这个:

>>>x.__dict__ # this will show everything that is contained in object x

# which in this case is something like {'_A__var' : 123}

>>>x._A__var = 456 # you now know the masked name of private variables

>>>x.printVar() # this gives back 456

您可能知道OOP中的方法是这样调用的: x.printVar() => A.printVar(x) ,如果 A.printVar() 可以访问 x 中的某个字段,也可以访问该字段 outside A.printVar() ...毕竟,为可重用性创建了函数,没有给出特殊的权限里面的陈述 .

当涉及编译器时,游戏会有所不同( privacy is a compiler level concept ) . 它知道带有访问控制修饰符的类定义,因此如果在编译时没有遵循规则,它就会出错

2 years ago

对不起那些“复活”线程的人,但是,我希望这会对某人有所帮助:

在Python3中,如果你只想“封装”类属性,就像在Java中一样,你可以像这样做:

class Simple:

def __init__(self, str):

print("inside the simple constructor")

self.__s = str

def show(self):

print(self.__s)

def showMsg(self, msg):

print(msg + ':', self.show())

要实例化这样做:

ss = Simple("lol")

ss.show()

请注意: print(ss.__s) 将抛出错误 .

实际上,Python3将模糊全局属性名称 . 将其转换为“私有”属性,就像在Java中一样 . 属性的名称仍然是全局的,但是以不可访问的方式,如其他语言中的私有属性 .

但不要害怕它 . 没关系 . 它也完成了这项工作 . ;)

2 years ago

正如上面许多评论中正确提到的那样,让我们不要忘记访问修饰符的主要目标:帮助代码用户理解应该改变的内容和不应该发生的内容 . 当你看到私人领域时,你不会乱用它 . 所以它主要是语法糖,可以通过_和__在Python中轻松实现 .

2 years ago

下划线约定中有一些私有变量 .

In [5]: class Test(object):

...: def __private_method(self):

...: return "Boo"

...: def public_method(self):

...: return self.__private_method()

...:

In [6]: x = Test()

In [7]: x.public_method()

Out[7]: 'Boo'

In [8]: x.__private_method()

---------------------------------------------------------------------------

AttributeError Traceback (most recent call last)

in ()

----> 1 x.__private_method()

AttributeError: 'Test' object has no attribute '__private_method'

有一些微妙的差异,但为了编程模式的思想纯度,它足够好 .

有一些@private装饰器的例子更接近实现这个概念,但是YMMV . 可以说,人们也可以写一个使用meta的类定义

2 years ago

“在java中,我们学过公共/私有/受保护的变量”

“为什么python中不需要这样做?”

出于同样的原因,Java中不需要它 .

您可以自由使用 - 或者不使用 private 和 protected .

作为Python和Java程序员,我发现 private 和 protected 是非常非常重要的设计概念 . 但实际上,在数万行Java和Python中,我从未真正使用过 private 或 protected .

为什么不?

这是我的问题“受到谁保护?”

我团队中的其他程序员?他们有源头 . 受保护意味着何时可以改变它?

其他团队的其他程序员?他们为同一家公司工作 . 他们可以 - 通过电话 - 获取消息来源 .

客户端?这是一种招聘工作(通常) . 客户(通常)拥有代码 .

那么,究竟是谁 - 我保护它免受伤害?

对 . 拒绝阅读API评论的精神分裂症反社会人士阻止 .

2 years ago

私人和受保护的概念非常重要 . 但是python - 只是一个原型设计和快速开发的工具,可用于开发的资源有限,这就是为什么python中的一些保护级别没有那么严格的原因 . 您可以在类成员中使用“__”,它可以正常工作,但看起来不够好 - 每次访问此类字段都包含这些字符 .

此外,你可以注意到python OOP概念并不完美,smaltalk或ruby更接近纯OOP概念 . 甚至C#或Java也更接近 .

Python是非常好的工具 . 但它是简化的OOP语言 . 在语法和概念上简化 . python存在的主要目标是为开发人员提供以非常快的方式编写具有高抽象级别的易读代码的可能性 .

2 years ago

Python对私有标识符的支持有限,通过一个自动将类名添加到以两个下划线开头的任何标识符的功能 . 在大多数情况下,这对程序员来说是透明的,但是净效果是任何以这种方式命名的变量都可以用作私有变量 .

有关详细信息,请参阅here .

通常,Python的面向对象实现与其他实现相比有点原始语言 . 但实际上,我喜欢这个 . 这是一个概念上非常简单的实现,非常适合语言的动态风格 .

2 years ago

Python没有像C或Java那样的私有变量 . 如果需要,您可以随时访问任何成员变量 . 但是,在Python中不需要私有变量,因为在Python中暴露类成员变量并不坏 . 如果您需要封装成员变量,则可以稍后使用“@property”执行此操作,而不会破坏现有的客户端代码 .

在python中,单个下划线“_”用于表示方法或变量不被视为类的公共API的一部分,并且api的这一部分可能在不同版本之间发生变化 . 您可以使用这些方法/变量,但如果您使用此类的较新版本,则代码可能会中断 .

双下划线“__”并不意味着“私人变量” . 您可以使用它来定义“类本地”的变量,这些变量不能被子类轻易覆盖 . 它会破坏变量名称 .

例如:

class A(object):

def __init__(self):

self.__foobar = None # will be automatically mangled to self._A__foobar

class B(A):

def __init__(self):

self.__foobar = 1 # will be automatically mangled to self._B__foobar

self .__ foobar的名字在A级自动被修改为self._A__foobar . 在B组中,它被自我毁坏了._B__foobar . 因此,每个子类都可以定义自己的变量__foobar,而不会覆盖其父变量 . 但没有什么能阻止您访问以双下划线开头的变量 . 但是,名称修改会阻止您顺便调用此变量/方法 .

我强烈建议观看Raymond Hettingers从Pycon 2013谈论“Pythons类开发工具包”(应该在Youtube上提供),这给出了一个很好的例子,为什么以及如何使用@property和“__” - 实例变量 .

2 years ago

它's cultural. In Python, you don' t写入其他类的实例或类变量 . 在Java中,如果你真的想要,没有什么能阻止你做同样的事情 - 毕竟,你总是可以编辑类本身的源来达到同样的效果 . Python放弃了安全性的假装并鼓励程序员负责 . 在实践中,这非常好用 .

如果由于某种原因想要模拟私有变量,可以始终使用PEP 8中的 __ 前缀 . Python破坏了像 __foo 这样的变量的名称,以便它们不容易被包含它们的类外的代码看到(尽管如果你足够坚定,你可以绕过它,就像你可以绕过Java的保护,如果你在它) .

按照相同的惯例, _ 前缀表示 stay away even if you're not technically prevented from doing so . 你不是't play around with another class'的变量看起来像 __foo 或 _bar .

2 years ago

我唯一一次使用私有变量是在写入或读取变量时我需要做其他事情,因此我需要强制使用setter和/或getter .

如前所述,这再次涉及文化 . 我一直致力于读取和编写其他类变量的项目是免费的 . 当一个实现被弃用时,需要花费更长的时间来识别使用该功能的所有代码路径 . 当强制使用setter和getter时,可以很容易地编写一个debug语句来识别已经调用过的方法以及调用它的代码路径 .

当您处于任何人都可以编写扩展的项目时,通知用户有关在几个版本中消失的弃用方法因此对于在升级时将模块破坏保持在最低限度至关重要 .

所以我的答案是;如果您和您的同事维护一个简单的代码集,那么保护类变量并不总是必要的 . 如果您正在编写可扩展系统,则必须使用代码对所有扩展需要捕获的核心进行更改 .

2 years ago

如前所述,您可以通过在其前面添加下划线来指示变量或方法是私有的 . 如果您觉得这不够,可以随时使用 property 装饰器 . 这是一个例子:

class Foo:

def __init__(self, bar):

self._bar = bar

@property

def bar(self):

"""Getter for '_bar'."""

return self._bar

这样,引用 bar 的某人或某事实际上是引用 bar 函数的返回值而不是变量本身,因此可以访问但不能更改它 . 但是,如果有人真的想要,他们可以简单地使用 _bar 并为其分配一个新值 . 正如已经反复说过的那样,没有万无一失的方法来阻止某人访问你想要隐藏的变量和方法 . 但是,使用 property 是您可以发送的最清晰的消息,即不要编辑变量 . property 也可以用于更复杂的getter / setter / deleter访问路径,如下所述:https://docs.python.org/3/library/functions.html#property

在python语言中定义私有成员变量的方法是_Python在类中有“私有”变量吗?相关推荐

  1. 在python语言中可作为源文件后缀名的是_Python使用符号#表示单行注释。

    [多选题]在2013清单计价中,其他项目界面,包括( ) [单选题]锂离子电池最常用的负极材料是碳材料,其理论嵌锂容量是() [单选题]某企业为增值税一般纳税人,购买原材料取得增值税专用发票上注明的价 ...

  2. 在python语言中可作为源文件后缀名的是_Python中的标识符不区分大小写。

    [单选题]python语言属于( ) [单选题]在屏幕上打印输出Hello World,使用的Python语句是( ) [单选题]以下关于Python缩进的描述中,错误的是( ) [单选题]关于 Py ...

  3. 在python语言中定义类的关键字是_Python 使用 _________________ 关键字来定义类。_学小易找答案...

    [判断题]我国公民的作品著作权的保护期为50年. [单选题]The broad principle that requires expenses to be reported in the same ...

  4. python语言中内置的字符串排版方法_python基础知识(python内置数据类型-字符串)...

    python中的字符串 字符串基本特点 字符串的本质是字符序列.python中的字符串是不可变的,无法对原字符串做任何修改(不能用下标赋值的方式去改变字符串).但是可以将字符串的一部分赋值创建新的字符 ...

  5. python语言中内置的字符串排版方法_Python14之字符串(各种奇葩的内置方法)

    一.字符串的分片操作 其分片操作和列表和元组一样 1 str1 = 'keshengtao' 2 str1[2:6]3 'shen' 4 str1[:]5 'keshengtao' 6 str1[:4 ...

  6. python语言中与扩展程序功能相关的保留字_Python语言中,与函数使用相关的保留字是哪个?...

    [填空题]Complete the sentences with the words below. 1. The ________of our company was attacked yesterd ...

  7. C语言中定义字符串的几种方法

    首先要知道字符串是以空字符(\0)结尾的char类型数组 可以用字符串常量,即#define 可以用char类型数组 指向char的指针

  8. python类中没有属性_如何在python语言中在类中删除属性和添加属性

    在python语言中的类,可以使用class定义类,调用__init__方法进行初始化:默认传入self,可以在后面在添加几个属性.可以使用setattr()添加属性,也可以使用delattr()删除 ...

  9. python中可以使用变量来引用函数吗_如何在python语言中使用函数变量并调用函数...

    在python语言中,除了常规变量之外,还有函数变量.把函数本身赋值给变量,这个变量为函数变量. 工具/原料 python pycharm 截图工具 WPS 方法/步骤 1 在已新建的python文件 ...

最新文章

  1. 《Visual C++ 开发从入门到精通》——2.7 变量
  2. destoon 多表联合查询时出现解析错误,parse_str函数解析错误
  3. CentOS 6.4 i386 版本安装 FastDFS、使用Nginx作为文件访问WEB服务器
  4. MySQL用中间件ProxySQL实现读写分离和主节点故障应用无感应
  5. 全球19家值得关注的物联网安全初创企业
  6. java编译后生成字节码_请问java源文件编译后怎么生成字节码文件?
  7. [设计模式] Javascript 之 观察者模式
  8. mac环境下node.js和phonegap/cordova创建ios和android应用
  9. 网页中查看pdf文档
  10. php 里如何进行时间比较,PHP实现时间比较和时间差计算的方法示例
  11. ASP.NET基础教程-DataGrid表格控件-更新数据
  12. [Err] 1136 - Column count doesn't match value count at row 35
  13. 分析Kvaser驱动安装到Linux系统——Kvaser安装到嵌入式Ubuntu系统的开发板IMX6Q不成功记录
  14. word如何绘制斜线表头
  15. 20155313 杨瀚 《网络对抗技术》实验七 网络欺诈防范
  16. java lpad oracle_oracle函数lpad的简单用法
  17. HACKTHEBOX——Starting Point Tier0
  18. Access把每一天的数据累加_SQL 数据库语句大全
  19. android数据写入文件格式,Android 本地文件保存数据(2020-08-07)
  20. OSChina 周一乱弹 ——生死之际还能从容装逼,先生大才

热门文章

  1. LeetCode 30. Substring with Concatenation of All Words
  2. 台大李宏毅Machine Learning 2017Fall学习笔记 (3)Bias and Variance (v2)
  3. Flask之Web表单使用
  4. tp5 mkdir(): Permission denied 问题
  5. Redis 高级教程 Redis 安全(2)
  6. linux——windows:上传、下载命令——rz,sz
  7. The connection to adb is down, and a severe error has occured
  8. C#值类型和引用类型的区别
  9. 大数据的岗位职责,我们未来的大数据职业选择有哪些
  10. 服务端指南 数据存储篇 | 聊聊 Redis 使用场景(转)