精华内容
下载资源
问答
  • python中的私有变量
    2021-02-10 21:35:31

    私有变量表示方法

    在变量前加上两个下划线的是私有变量。

    class Teacher():

    def __init__(self,name,level):

    self.__name=name

    self.__level=level

    #获取老师的等级

    def get_level(self):

    return self.__level

    #获取名字

    def get_in_name(self):

    return self.__name

    动态方法无法读取私有变量

    即使是动态方法也无法读取私有变量,强行读取会报错。

    #定义动态方法

    def get_name(self):

    return self.__name

    #动态方法赋值

    Teacher.get_name=get_name

    t=Teacher("GG",5)

    print("level is: ",t.get_level()) #可行

    print("name is",t.get_name()) #报错,显示没有该属性

    动态方法无法修改私有变量

    动态方法也无法修改私有变量,强行修改不会报错,但是没有效果。

    t.set_name("NN") #实际没有效果但是不报错

    print(t.get_in_name()) #类内部获取名字,输出GG

    强行读取和修改私有变量

    那么强行要读取和改变私有变量怎么办呢?

    有一个不推荐但是可行的办法:

    私有属性在对象内部被名字是”类名_属性名”。

    在这个例子里,是这样的:

    print("name is",t._Teacher__name) #输出GG

    t._Teacher__name="AA" #被改变了

    print("name is",t._Teacher__name) #输出AA

    更多相关内容
  • python中继承时,私有变量出现以下错误:AttributeError: 'dog' object has no attribute '_dog__name'我找了很多东西,但不知道我的问题在哪里class animal(object):__name = ""__height = ""__weight = ""__...

    在python中继承时,私有变量出现以下错误:AttributeError: 'dog' object has no attribute '_dog__name'

    我找了很多东西,但不知道我的问题在哪里class animal(object):

    __name = ""

    __height = ""

    __weight = ""

    __sound = ""

    def __init__(self, name, height, weight, sound):

    self.__name = name

    self.__height = height

    self.__weight = weight

    self.__sound = sound

    def toString(self):

    return "{} is {} cm and {} weight and say {}.".format(self.__name, self.__height, self.__weight, self.__sound)

    class dog(animal):

    __owner = ""

    def __init__(self, name, height, weight, sound, owner):

    self.__owner = owner

    super(dog, self).__init__(name, height, weight, sound)

    def toString(self):

    return "{} is {} cm and {} weight and say {} and belongs to {}.".format(self.__name, self.__height,

    self.__weight, self.__sound,

    self.__owner)

    puppy = dog('puppy', 45, 15, 'bark', 'alex')

    puppy.toString()

    展开全文
  • python中私有变量的实现 这是一个在python展示私有变量的演示。您可能知道,python在类绝对没有私有变量。您可以实现的最接近的方法是,在诸如__foo之类的变量之前使用__运算符。这样,python会自动将变量...
  • Python 中私有变量的定义和用法

    千次阅读 2019-10-12 16:01:19
    为什么设计私有变量 大多数 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 代码都遵循这样一个约定:带有一个下划线的名称 (例如: _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]Python中私有变量
  • 在这里强调说一下私有变量,python默认的成员函数和成员变量都是公开的,没有像其他类似语言的public,private等关键字修饰.但是可以在变量前面加上两个下划线"_",这样的话函数或变量就变成私有的.这是python私有变量...
  • 我们知道,类私有变量是不能直接在类外访问或修改的,因此我们可以设置一个get函数和一个set函数来间接访问和修改私有属性,那么每次访问和修改的都需要调用函数,有没有更简单的方法呢?下面介绍两种方法: 1. ...
  • Python中,变量名类似__x__的,以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的(比如 __doc__, __init__等),不是private变量,所以,不能用__name__、__sex__这样的变量名定义私有...
  • python中私有变量为伪私有变量。以下有两种方法对其进行访问。 方法1: 方法2:_类名 __变量名
  • _test3(): print("---test3--") from somemodule import * 在使用 from somemodule import * 导入模块的情况下,不能导入或使用私有属性和方法。 >>> from test import * >>> num 10 >>> _num Traceback (most ...
  • 首先我们这里先描述下: Python中,变量名类似__x__的,以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的(比如 __doc__, __init__等),...我们看个例子:访问python私有变量: class
  • class Name():  __name = 'hello world'  def name(self):  return(Name.__name)   1. p = Name() p._Name__name 2. p = Name() p.name()
  • 使用“__”开头的变量和方法为私有变量和方法class Student():def __init__(self, name, age):# 构造函数# 初始化变量的属性self.name = nameself.age = ageself.__score = 0 # 这里是私有变量# def __marking(self,...
  • python中私有变量
  • Python私有变量与私有方法
  • 一、私有变量的定义在Python中,有以下几种方式来定义变量:xx:公有变量_xx:单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入__xx:双前置下划线,私有化属性或方法,...
  • python class 私有变量

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

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

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

    2020-12-15 11:52:27
    1.类的私有变量和私有方法1)_xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如:当使用“from Mimport”时,不会将以一个下划线开头的对象引入。2)__...
  • 看到类以及私有变量时, 想到以前看过文章, 说Python里面有私有函数也能被调用, 就顺手搜索了一下, stackoverflow有个问题就是问这个的. Why are Python‘s ‘private‘ methods not actually private?HOW类里面用两...
  • python中定义私有变量和私有方法只需要在变量名或函数名前加上 “__”两个下划线 在类内部的方法使用时 self.__变量名或函数名。 实际上,如果真要访问私有变量和私有方法,也是可以访问的,因为实际上私有...
  • 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...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,687
精华内容 22,674
关键字:

python中的私有变量