精华内容
下载资源
问答
  • python定义私有变量的方法为
    2020-11-21 02:13:55

    学过编程语言的人员,都知道私有变量在编程中必不可少,与Java和C语言用private关键字定义私有变量不同,Python是在变量前面加上双横杠(例如:__test)来标识,

    Python私有变量只能在类内部使用,不被外部调用,且当变量被标记为私有后,调用时需再变量的前端插入类名,在类名前添加一个下划线,即“_ClassName__变量名”形式。

    Python私有变量或方法在自身类中不能直接调用,需通过在类中定义接口,实现私有变量的引用、读取和修改。

    除了Python私有变量是使用“_”定义之外,还有两种特殊变量,分别是:

    1. _xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如: 当使用“from M import”时,不会将以一个下划线开头的对象引入 。

    2. __xx__定义的是特列方法。用户控制的命名空间内的变量或是属性,如init , __import__或是file 。只有当文档有说明时使用,不要自己定义这类变量。

    其实,Python并没有真正的私有化支持,用下划线得到的也是伪私有,因此,在Python编程中应尽量避免使用定义以下划线开头的变量!

    更多相关内容
  • 这篇文章主要介绍了Python类如何定义私有变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下前言在java 的类中,如果你要定义一个私有变量,可以用修饰词 ...

    这篇文章主要介绍了Python类如何定义私有变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    前言

    在java 的类中,如果你要定义一个私有变量,可以用修饰词 private,那么在Python 的类中呢,Python中没public private之类的修饰词,那Python 是如何定义私有变量的呢?

    私有变量

    在Python 类中定义私有变量,只要在变量前加 __ (两个下划线) ,那么该类的实例就不能引用了,看下面实例

    >>> class demo(object):

    ... __a =1

    ... b = 2

    ...

    >>> d = demo()

    >>> print(d.b)

    >>> d.__a

    Traceback (most recent call last):

    File "", line 1, in

    AttributeError: 'demo' object has no attribute '__a'

    从上面的示例中可以看到,类demo的实例d可以不能调用变量__a,那实例d 有没有办法调用到__a呢,看下面的调用语法:

    >>> d._demo__a

    1

    实例名+'_'+类名+私有变量 ,就能调用。大家记住这样的语法。

    私有方法

    私有方法同私有变量的语法也是一样的,我们直接看示例:

    >>> class fun(object):

    ... def __a(self):

    ... print('聚焦学院AAA')

    ... def b(self):

    ... print('聚焦学院BBB')

    ...

    >>> f = fun()

    >>> f.b()

    聚焦学院BBB

    >>> f.__a()

    Traceback (most recent call last):

    File "", line 1, in

    AttributeError: 'fun' object has no attribute '__a'

    >>> f._fun__a()

    聚焦学院AAA

    从上面的示例中可以看到,类的实例要调用私有方法也是和调用私有变量的语法一样。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

    本文标题: Python类如何定义私有变量

    本文地址: http://www.cppcns.com/jiaoben/python/299393.html

    展开全文
  • 什么设计私有变量大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (例如: _spam) 应该被当作是 API 的非公有部分 (无论它是函数、方法或是数据成员)。为了保证对于类私有成员的有效使用(例如避免名称...

    为什么设计私有变量

    大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (例如: _spam) 应该被当作是 API 的非公有部分 (无论它是函数、方法或是数据成员)。

    为了保证对于类私有成员的有效使用(例如避免名称与派生类所定义的名称相冲突),设立了名称改写(name mangling)机制。 任何形式为 __spam 的标识符(至少带有两个前缀下划线,至多一个后缀下划线)的文本将被替换为 _classname__spam,其中 classname 为去除了前缀下划线的当前类名称。 这种改写不考虑标识符的句法位置,只要它出现在类定义内部就会进行。

    名称改写有助于让子类重载方法而不破坏类内方法调用。例如:

    class Mapping:

    def __init__(self, iterable):

    self.items_list = []

    self.__update(iterable)

    def update(self, iterable):

    for item in iterable:

    self.items_list.append(item)

    __update = update   # private copy of original update() method

    class MappingSubclass(Mapping):

    def update(self, keys, values):

    # provides new signature for update()

    # but does not break __init__()

    for item in zip(keys, values):

    self.items_list.append(item)

    上面的示例即使在 MappingSubclass 引入了一个 __update 标识符的情况下也不会出错,因为它会在 Mapping 类中被替换为 _Mapping_update 而在 MappingSubclass 中被替换为_MappingSubclass _update 。改写规则的设计主要是为了避免意外冲突;访问或修改被视为私有的变量仍然是可能的。

    变量的定义

    xx:公有变量

    _xx:单下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入

    __xx:双下划线,私有化属性或方法,无法在外部直接访问(名字改写不能访问)

    __xx__:双前后下划线,系统定义名字(用户避免使用)

    xx_:单下划线,用于避免与Python关键词的冲突

    示例1:对于变量的访问

    class student(object):

    def __init__(self):

    self.num = 10

    self._name = "wang"

    self.__grade = 30

    stu = student()

    print(stu.num)              # 10

    print(stu._name)            # wang

    # print(stu.__grade)        # error

    print(stu._student__grade)  # 30

    stu.__grade = 40

    print(stu.__grade)          # 40

    print(stu._student__grade)  # 30

    stu._student__grade = 50

    print(stu.__grade)          # 40

    print(stu._student__grade)  # 50

    尤其注意最后六行,可以看到名称改写对私有变量的影响。

    可以看出,不能在外部直接访问双下划线的私有变量,而用改写后的名字即可访问,因此可知在 Python 中并没有严格意义上的私有变量。在编程的时候应该注意这一点。

    示例2:从外部导入对私有变量的影响

    _variable 类型的属性或方法不能通过 from module import * 语句导入,能够通过 import module 语句导入

    # test.py

    num = 10

    _name = "wang"

    __grade = 30

    def get_num():

    print("get_num")

    def _get_name():

    print("get_name")

    def __get_grade():

    print("get_grade")

    from test import *

    print(num)                 # 10

    # print(_name)             # error

    # print(__grade)           # error

    get_num()                  # get_num

    # _get_name()              # error

    # __get_grade()            # error

    import test

    print(test.num)                 # 10

    print(test._name)               # wang

    print(test.__grade)             # 30

    test.get_num()                  # get_num

    test._get_name()                # get_name

    test.__get_grade()              # get_grade

    可知,利用 import ... 和 from module import ... 导入后,对于变量的引用方式也是有区别,具体可以看这篇文章。

    也可以通过装饰器来调用私有变量,详细的可以看这篇文章。

    参考资料:

    1. Python官方文档:https://docs.python.org/zh-cn/3.7/

    2. 博客:https://www.cnblogs.com/semon-code/p/8242062.html

    展开全文
  • python定义私有变量只需要在变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就是私有的了。在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__mem...

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量。

    在python中定义私有变量只需要在变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就是私有的了。

    在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__membername,也就是说,类的内部定义中,

    所有以双下划线开始的名字都被"翻译"成前面加上单下划线和类名的形式。

    例如:为了保证不能在class之外访问私有变量,Python会在类的内部自动的把我们定义的__spam私有变量的名字替换成为

    _classname__spam(注意,classname前面是一个下划线,spam前是两个下划线),因此,用户在外部访问__spam的时候就会

    提示找不到相应的变量。 python中的私有变量和私有方法仍然是可以访问的;访问方法如下:

    私有变量:实例._类名__变量名

    私有方法:实例._类名__方法名()

    其实,Python并没有真正的私有化支持,但可用下划线得到伪私有。 尽量避免定义以下划线开头的变量!

    (1)_xxx "单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,

    需通过类提供的接口进行访问;不能用'from module import *'导入

    (2)__xxx 类中的私有变量/方法名 (Python的函数也是对象,所以成员方法称为成员变量也行得通。),

    " 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

    (3)__xxx__ 系统定义名字,前后均有一个“双下划线” 代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。

    下面我们看几个例子:

    【1】

    class A(object):

    def __init__(self):

    self.__data=[] #翻译成 self._A__data=[]

    def add(self,item):

    self.__data.append(item) #翻译成 self._A__data.append(item)

    def printData(self):

    print self.__data #翻译成 self._A__data

    a=A()

    a.add('hello')

    a.add('python')

    a.printData()

    #print a.__data #外界不能访问私有变量 AttributeError: 'A' object has no attribute '__data'

    print a._A__data #通过这种方式,在外面也能够访问“私有”变量;这一点在调试中是比较有用的!

    运行结果是:

    ['hello', 'python']

    ['hello', 'python']

    【2】

    获取实例的所有属性 print a.__dict__

    获取实例的所有属性和方法 print dir(a)

    class A():

    def __init__(self):

    self.__name='python' #私有变量,翻译成 self._A__name='python'

    def __say(self): #私有方法,翻译成 def _A__say(self)

    print self.__name #翻译成 self._A__name

    a=A()

    #print a.__name #访问私有属性,报错!AttributeError: A instance has no attribute '__name'

    print a.__dict__ #查询出实例a的属性的集合

    print a._A__name #这样,就可以访问私有变量了

    #a.__say()#调用私有方法,报错。AttributeError: A instance has no attribute '__say'

    print dir(a)#获取实例的所有属性和方法

    a._A__say() #这样,就可以调用私有方法了

    运行结果:

    {'_A__name': 'python'}

    python

    ['_A__name', '_A__say', '__doc__', '__init__', '__module__']

    python

    从上面看来,python还是非常的灵活,它的oop没有做到真正的不能访问,只是一种约定让大家去遵守,

    比如大家都用self来代表类里的当前对象,其实,我们也可以用其它的,只是大家习惯了用self 。

    【3】小漏洞:派生类和基类取相同的名字就可以使用基类的私有变量

    class A():

    def __init__(self):

    self.__name='python' #翻译成self._A__name='python'

    class B(A):

    def func(self):

    print self.__name #翻译成print self._B__name

    instance=B()

    #instance.func()#报错:AttributeError: B instance has no attribute '_B__name'

    print instance.__dict__

    print instance._A__name

    运行结果:

    {'_A__name': 'python'}

    python

    class A():

    def __init__(self):

    self.__name='python' #翻译成self._A__name='python'

    class A(A): #派生类和基类取相同的名字就可以使用基类的私有变量。

    def func(self):

    print self.__name #翻译成print self._A__name

    instance=A()

    instance.func()

    运行结果:

    python

    展开全文
  • Python中可以通过在...这是python私有变量轧压(这个翻译好拗口),英文是(private name mangling.) **情况就是当变量被标记私有后,在变量的前端插入类名,再类名前添加一个下划线"_",即形成了_ClassName__变量名.**
  • 主要介绍了Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法,结合具体实例形式较为详细的分析了Python面向对象程序设计中类的定义、实例化、封装、私有变量、私有方法等相关使用技巧,需要的朋友可以...
  • python如何定义私有变量

    千次阅读 2018-03-21 22:35:45
    1、python是不含有private关键字的,因此在定义私有变量时,只需要在变量的前面加上双横杠(例如:__name)即可。class Test(): def __init__(self): self.__name__ = '' self.__value__= 1 def get_name(self): ...
  • python定义私有变量只需要在变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就是私有的了。在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__mem...
  • # 在变量前加上__将变量变成私有变量,类外无法使用 __interest_rate = 0.855 def __init__(self, amount, owner): self.__amount = amount self.owner = owner def desc(self): # 类内调用私有变量 print...
  • python定义私有变量和私有方法只需要在变量名或函数名前加上 “__”两个下划线 在类内部的方法中使用时 self.__变量名或函数名。 实际上,如果真要访问私有变量和私有方法,也是可以访问的,因为实际上私有...
  • python私有方法是什么

    2020-11-30 01:33:33
    python定义私有变量只需要在变量名或函数名前加上 "__"两个下划线,那么这个函数或变量就会私有的了声明该方法为私有方法,不能在类的外部调用代码class Test(object):#普通方法def test(self):print("普通...
  • 私有变量表示方法 在变量前加上两个下划线的是私有变量。 class Teacher(): def __init__(self,name,level): self.__name=name self.__level=level #获取老师的等级 def get_level(self): return self.__...
  • Python私有变量定义和用法

    千次阅读 2019-10-12 16:01:19
    什么设计私有变量 大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (例如: _spam) 应该被当作是 API 的非公有部分 (无论它是函数、方法或是数据成员)。 为了保证对于类私有成员的有效使用(例如...
  • python class 私有变量

    2020-12-05 14:06:20
    python定义私有变量只需要在变量名或函数名前加上”__“两个下划线,那么这个函数或变量就是私有的了。在内部,python使用一种name mangling 技术,将 __membername替换成 _classname__mem...
  • python—真假私有变量

    2021-01-20 03:07:49
    定义私有属性或方法加个__即可(双下划线) 先来定义对象的私有属性(方法一样) class Person(): def __init__(self, name, age): self.name = name self.__age = age def __str__(self): return {},{}.format...
  • 在学习Python的过程中发下,它把类(class)中所有的成员函数和成员变量都看做是"Public"的,作为C++出身的程序员们可能就不习惯了。Python的官方教程中如是说:““Private” instance variables that cannot be ...
  • 本篇我们介绍封装(encapsulation)的概念,以及如何在 Python 中利用私有属性实现封装。封装是将数据和方法打包成一个类...按照惯例,单下划线前缀的属性被视为私有属性。Python 会对双下划线前缀的属性进行名称改写。
  • python类的私有变量

    2020-12-15 11:52:27
    1.类的私有变量和私有方法1)_xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如:当使用“from Mimport”时,不会将以一个下划线开头的对象引入。2)__...
  • Possible Duplicate:The meaning of a single- and a double-underscore before an object name in Pythonpython中,对于私有成员和方法,我应该使用哪个foo(下划线)或u bar(双下划线)?谢谢大家。我找到了另一个...
  • python基础学习-公有变量与私有变量

    千次阅读 2021-10-11 09:22:49
    Python定义私有变量只需要在变量名或函数名前加上两个下划线"_",那么这个函数或变量就会私有的了。 无法直接访问私有变量 # 私有变量,通过添加两个下划线定义 class Person: __name = '人名' p = Per
  • python私有变量

    千次阅读 2019-06-13 18:00:15
    在看python代码的时候,有时候会发现有的变量或者函数前面会加入“_”(一个杠)或者“__”(两个杠)来表示变量私有,出于好奇,在网上找了很多说法并结合自己实际操作,简单记录一下这方面的内容。 1. 与类无关...
  • Python类中的①私有变量/方法、②静态方法和③类方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,195
精华内容 17,678
热门标签
关键字:

python定义私有变量的方法为