精华内容
下载资源
问答
  • python类私有公有变量
    千次阅读
    2022-03-03 15:20:09

    结论:python里并没有严格的私有变量和函数限制,仅仅是对程序员的限制,尽量不要去使用

    (1)_xxx "单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问
    (2)__xxx 类中的私有变量/方法名 " 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
    (3)__x__ 系统定义名字,前后均有一个“双下划线” 代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。

    class test:
    	def __init__(self, a):
    		self.__a = a
    	def __get():
    		return self.__a
    

    python里的私有变量和私有方法都以双下划线开头

    d.__a
    Traceback (most recent call last):
      File "<pyshell#37>", line 1, in <module>
        d.__a
    AttributeError: 'test' object has no attribute '__a'
    d.__geta()
    Traceback (most recent call last):
      File "<pyshell#38>", line 1, in <module>
        d.__geta()
    AttributeError: 'test' object has no attribute '__geta'. Did you mean: '__ge__'?
    

    如果想要直接访问私有变量和私有函数,解释器会报错说类里没有这个属性

    但是python的私有其实是伪私有,其实是python的名字改装在起作用,在类外访问类里的私有元素,变量和方法会被改名,加上_<类名>即可访问私有变量和私有方法

    d._test__a
    1
    d._test__geta()
    1
    
    更多相关内容
  • python基础学习-公有变量私有变量

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

    1、公有变量

    默认上来说对象的属性和方法都是公开的,我们可以通过点这个操作符进行访问

    # 公有的属性和方法通过点操作符访问
    class Person:
      name = '人名'
    p = Person()
    print(p.name)
    

    在这里插入图片描述

    2、私有变量

    在Python中定义私有变量只需要在变量名或函数名前加上两个下划线"_",那么这个函数或变量就会为私有的了。

    无法直接访问私有变量

    # 私有变量,通过添加两个下划线定义
    class Person:
      __name = '人名'
    p = Person()
    
    
    # 无法从外部进行访问
    print(p.__name)
    

    在这里插入图片描述

    调用方法返回内部属性
    这里把person当中的name属性私有化后,我们无法在外部访问这个属性,我们可以通过调用方法,返回类的属性,从内部进行访问。

    # 私有变量,通过添加两个下划线定义
    class Person:
      __name = '人名'
      # 添加方法从内部进行访问
      def getPivateName(self):
        return self.__name
    p = Person()
    
    
    # # 无法从外部进行访问
    # print(p.__name)
    
    # 通过调用方法从内部访问name属性
    print(p.getPivateName())
    
    

    在这里插入图片描述

    名字改编
    但其实python内部采用了一种叫 name mangling(名字改编)的技术,把双下划线开头的变量进行改名。实际上在外部使用“_类名__变量名“即可访问双下划线开头的私有变量了

    # 私有变量,通过添加两个下划线定义
    class Person:
      __name = '人名'
      # 添加方法从内部进行访问
      def getPivateName(self):
        return self.__name
    p = Person()
    
    
    # # 无法从外部进行访问
    # print(p.__name)
    
    # # 通过调用方法从内部访问name属性
    # print(p.getPivateName())
    
    # 通过名字改编 name mangling 访问内部属性
    print(p._Person__name)
    
    

    在这里插入图片描述
    其实这里的私有机制有一点伪私有的感觉,python的类事实上是没有权限控制的

    展开全文
  • 参考链接: Python中的私有变量 我们这里就直奔主题,不做基础... a = 100 #公有变量 _b = 200 #公有变量 __c = 300 #私有变量 __d__ = 400 #公有变量 a = A() #实例化一个对象a,当然可以取另外一个名字b ...

    参考链接: Python中的私有变量

    我们这里就直奔主题,不做基础铺垫,默认你有一些Python类的基础,大家在看这篇博客的时候,如果基础知识忘了,可以去菜鸟教程 

    从一个简单的类开始 

    class A():       #定义一个类 A

        a     = 100  #公有变量

        _b    = 200  #公有变量

        __c   = 300  #私有变量

        __d__ = 400  #公有变量

    a = A()     #实例化一个对象a,当然可以取另外一个名字b

    print(a.a,a._b,a.__c,a.__d__)   #打印四个变量的值

     

    运行结果: Traceback (most recent call last): File “c:\users\12090\desktop\a.py”, line 7, in  print(a.a,a._b,a.__c,a.d) AttributeError: ‘A’ object has no attribute ‘__c’ 

     

      

       

      

     

    运行结果,提示__c不能访问,这里的错误信息,并没有指出__c是私有变量,在类外不能访问 我们程序这样改动  

    通过成员函数间接访问私有变量 

     

    a=A,和a=A()的区别 

    我们把第8行改造一下: 去掉括号,就像这样:  

    a = A会成功生成对象a,而且通过对象a可以正确访问到公有变量a,_b,d。但是在调用函数print_c()的时候,出问题,错误提示 TypeError: print_c() missing 1 required positional argument: ‘self’ 提示缺少参数,怎么解决这个问题呢: 显示传递一个类,或者对象进去  那么a=A,和a=A()有什么区别呢? 区别是: 如果是a=A,则不会调用类中的构造函数; 如果是a=A(),则会调用构造函数; 

    A()会调用构造函数 

    我们来做一个实验, python中的构造函数名是系统规定的,init,添加后如下: 

    class A():       #定义一个类 A

        a     = 100  #公有变量

        _b    = 200  #公有变量

        __c   = 300  #私有变量

        __d__ = 400  #公有变量

        def __init__(self):   #构造函数定义

            print('calling __init__....')

        def print_c(self):  #通过成员函数访问私有变量

            return self.__c

    a = A          #不会调用构造函数

    print(a.a,a._b,a.print_c(a),a.__d__)

    b = A()        #会调用构造函数   

    print(b.a,b._b,b.print_c(),b.__d__)

     

    运行结果:  当我们通过A()这种形式构造对象的时候,会显示调用构造函数__init__。 当我们通过A这种形式构造对象的时候,不会调用构造函数。 

    构造函数,构造了什么 

    “构造”这个词,是一个动词,就是要造一个东西,那么造什么呢,其实我们上面的例子,可能让初学者有点不明所以,所以接下来,我们让构造函数做点有意义的事情,程序如下: 

    class A():       #定义一个类 A

        a     = 100  #公有变量

        _b    = 200  #公有变量

        __c   = 300  #私有变量

        __d__ = 400  #公有变量

        def __init__(self,a,b,c,d):   #通过构造函数给公有变量或者私有变量重新赋值

            print('构造前:',self.a,self._b,self.__c,self.__d__)

            self.a = a

            self._b = b

            self.__c = c

            self.__d__ = d

            print('构造后:',self.a,self._b,self.__c,self.__d__)

        def print_c(self):  #通过成员函数访问私有变量

            return self.__c

    a = A(1000,2000,3000,4000)          #通过传值构造对象

     

    运行结果:  这个例子,就证明了构造函数的作用 

    python中 self的作用 

    self这个单词是自己,自我的意思,它代表对象本身,其实你可以换一个单词也可以,比如you  

    照样可以运行 甚至一个地方用self,一个地方用you也可以  

    self的实际意义 

    我们一般使用self,python系统也默认是self,但是self的作用远不止单词意思这么简单 比如我们去掉self  

    运行起来,好像也没问题,但是这里的a,_b,__c,d(构造函数里面),并不是公有变量中的a,_b,__c,d。怎么见得呢? 我们把第七行打开  运行结果出错: Traceback (most recent call last): File “c:\users\12090\desktop\a.py”, line 13, in  a = A(1000,2000,3000,4000) #调用构造函数 File “c:\users\12090\desktop\a.py”, line 7, in init print(‘构造前:’,a,_b,__c,d) UnboundLocalError: local variable ‘_b’ referenced before assignment 

    错误原因,是本地变量_b没有引用,这个local是本地的意思,也就是在构造函数__init__函数作用范围内。那么第7行的a为什么没有报错呢,因为a用的是参数里面的a,并不是公有变量中a。 所以,第12行的打印结果,其实打印的是局部变量,也就是说,在构造函数里面我们定义了一套与公有变量同名的变量,在这种情况下,局部变量优先。 所以,self其实非常有作用,必须通过self来显示指定公有变量,不然会当作局部变量。 我们还可以进一步说明这个问题 

    进一步证明 

     

    结论 

    Python类中公有变量和私有变量定义一般定义在类名下面,构造函数上面,比如这样: class A: 公有变量 私有变量 def init(): 。。。 其中私有变量需要有前缀下划线__ 如果成员函数(包括构造函数),中出现了与公有变量(私有变量)同名的变量,则python系统会屏蔽公有变量和私有变量,把改变量当成局部变量。如果要在成员函数(包括构造函数)使用公有变量和私有变量,必须通过self显示指定,就像这样: class A: a = 100 _b = 200 __c = 300 def init(self,a,b,c): self.a = a #使用公有变量a _b = b #屏蔽了公有变量_b,重新定义了一个局部变量_b self.__c =c #使用私有变量__c

    展开全文
  • Python类中的私有变量和公有变量

    千次阅读 2020-07-30 14:20:25
    我们这里就直奔主题,不做基础铺垫,默认你有一些Python类的基础,大家在看这篇博客的时候,如果基础知识忘了,可以去菜鸟教程 从一个简单的开始 class A(): #定义一个 A a = 100 #公有变量 _b = 200 #公有...

    我们这里就直奔主题,不做基础铺垫,默认你有一些Python类的基础,大家在看这篇博客的时候,如果基础知识忘了,可以去菜鸟教程

    从一个简单的类开始

    class A():       #定义一个类 A
        a     = 100  #公有变量
        _b    = 200  #公有变量
        __c   = 300  #私有变量
        __d__ = 400  #公有变量
    a = A()     #实例化一个对象a,当然可以取另外一个名字b
    print(a.a,a._b,a.__c,a.__d__)   #打印四个变量的值
    

    运行结果:
    Traceback (most recent call last):
    File “c:\users\12090\desktop\a.py”, line 7, in
    print(a.a,a._b,a.__c,a.d)
    AttributeError: ‘A’ object has no attribute ‘__c’

    运行结果,提示__c不能访问,这里的错误信息,并没有指出__c是私有变量,在类外不能访问
    我们程序这样改动
    在这里插入图片描述

    通过成员函数间接访问私有变量

    在这里插入图片描述

    a=A,和a=A()的区别

    我们把第8行改造一下:
    去掉括号,就像这样:
    在这里插入图片描述

    a = A会成功生成对象a,而且通过对象a可以正确访问到公有变量a,_b,d。但是在调用函数print_c()的时候,出问题,错误提示
    TypeError: print_c() missing 1 required positional argument: ‘self’
    提示缺少参数,怎么解决这个问题呢:
    显示传递一个类,或者对象进去
    在这里插入图片描述
    那么a=A,和a=A()有什么区别呢?
    区别是:
    如果是a=A,则不会调用类中的构造函数;
    如果是a=A(),则会调用构造函数;

    A()会调用构造函数

    我们来做一个实验,
    python中的构造函数名是系统规定的,init,添加后如下:

    class A():       #定义一个类 A
        a     = 100  #公有变量
        _b    = 200  #公有变量
        __c   = 300  #私有变量
        __d__ = 400  #公有变量
        def __init__(self):   #构造函数定义
            print('calling __init__....')
        def print_c(self):  #通过成员函数访问私有变量
            return self.__c
    a = A          #不会调用构造函数
    print(a.a,a._b,a.print_c(a),a.__d__)
    b = A()        #会调用构造函数   
    print(b.a,b._b,b.print_c(),b.__d__)
    

    运行结果:
    在这里插入图片描述
    当我们通过A()这种形式构造对象的时候,会显示调用构造函数__init__。
    当我们通过A这种形式构造对象的时候,不会调用构造函数。

    构造函数,构造了什么

    “构造”这个词,是一个动词,就是要造一个东西,那么造什么呢,其实我们上面的例子,可能让初学者有点不明所以,所以接下来,我们让构造函数做点有意义的事情,程序如下:

    class A():       #定义一个类 A
        a     = 100  #公有变量
        _b    = 200  #公有变量
        __c   = 300  #私有变量
        __d__ = 400  #公有变量
        def __init__(self,a,b,c,d):   #通过构造函数给公有变量或者私有变量重新赋值
            print('构造前:',self.a,self._b,self.__c,self.__d__)
            self.a = a
            self._b = b
            self.__c = c
            self.__d__ = d
            print('构造后:',self.a,self._b,self.__c,self.__d__)
        def print_c(self):  #通过成员函数访问私有变量
            return self.__c
    a = A(1000,2000,3000,4000)          #通过传值构造对象
    

    运行结果:
    在这里插入图片描述
    这个例子,就证明了构造函数的作用

    python中 self的作用

    self这个单词是自己,自我的意思,它代表对象本身,其实你可以换一个单词也可以,比如you
    在这里插入图片描述

    照样可以运行
    甚至一个地方用self,一个地方用you也可以
    在这里插入图片描述

    self的实际意义

    我们一般使用self,python系统也默认是self,但是self的作用远不止单词意思这么简单
    比如我们去掉self
    在这里插入图片描述

    运行起来,好像也没问题,但是这里的a,_b,__c,d(构造函数里面),并不是公有变量中的a,_b,__c,d。怎么见得呢?
    我们把第七行打开
    在这里插入图片描述
    运行结果出错:
    Traceback (most recent call last):
    File “c:\users\12090\desktop\a.py”, line 13, in
    a = A(1000,2000,3000,4000) #调用构造函数
    File “c:\users\12090\desktop\a.py”, line 7, in init
    print(‘构造前:’,a,_b,__c,d)
    UnboundLocalError: local variable ‘_b’ referenced before assignment

    错误原因,是本地变量_b没有引用,这个local是本地的意思,也就是在构造函数__init__函数作用范围内。那么第7行的a为什么没有报错呢,因为a用的是参数里面的a,并不是公有变量中a。
    所以,第12行的打印结果,其实打印的是局部变量,也就是说,在构造函数里面我们定义了一套与公有变量同名的变量,在这种情况下,局部变量优先。
    所以,self其实非常有作用,必须通过self来显示指定公有变量,不然会当作局部变量。
    我们还可以进一步说明这个问题

    进一步证明

    在这里插入图片描述

    结论

    Python类中公有变量和私有变量定义一般定义在类名下面,构造函数上面,比如这样:
    class A:
    公有变量
    私有变量
    def init():
    。。。
    其中私有变量需要有前缀下划线__
    如果成员函数(包括构造函数),中出现了与公有变量(私有变量)同名的变量,则python系统会屏蔽公有变量和私有变量,把改变量当成局部变量。如果要在成员函数(包括构造函数)使用公有变量和私有变量,必须通过self显示指定,就像这样:
    class A:
    a = 100
    _b = 200
    __c = 300
    def init(self,a,b,c):
    self.a = a #使用公有变量a
    _b = b #屏蔽了公有变量_b,重新定义了一个局部变量_b
    self.__c =c #使用私有变量__c

    展开全文
  • student1是公有变量,可以在函数外修改变量,比如我写的right部分;student2是私有变量,但是不可以在函数外修改变量,比如我写的wrong...公有变量私有变量的表面区别,就是在变量前加了两个下划线__。class St...
  • python中定义私有变量只需要在变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就是私有的了。在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__mem...
  • python中,内方法外的变量叫属性,内方法内的变量叫字段。他们的私有公有访问方法类似。 class C: __name="私有属性" def func(self): print(C.__name) class sub_C(C): def info(self): print(C.__name)#...
  • 公共变量Python不会限制我们访问python程序中的任何变量或调用任何成员方法。默认情况下,所有python变量和方法在Python中都是公共的。因此,当我们要公开任何变量或方法时,我们什么也不做。让我们看下面的例子-...
  • 目录* 1、私有成员变量介绍 + (1)私有成员变量概念 + (2)私有成员变量特点 + (3)私有成员变量体验 2、属性私有化工作原理 3、定义成员变量的标识符规范 4、私有成员变量的获取和设置方式 1、私有成员变量...
  • 为什么设计私有变量大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (例如: _spam) 应该被当作是 API 的非公有部分 (无论它是函数、方法或是数据成员)。为了保证对于类私有成员的有效使用(例如避免名称...
  • 看到以及私有变量时, 想到以前看过文章, 说Python里面有私有函数也能被调用, 就顺手搜索了一下, stackoverflow有个问题就是问这个的. Why are Python‘s ‘private‘ methods not actually private?HOW里面用两...
  • 0 引言 Python语言中,一切皆对象。对于Python语言中的变量,我想大家...这里给大家介绍Python类(class)中的变量之间的区别。参考代码: class G(): fly = False #中的全局变量 def __init__(self): selg....
  • python中的公有变量私有变量

    千次阅读 2019-11-15 12:32:26
    name = 'test'#给公有变量name变量赋值 a = Person()#实例化对象 print(a.name)#打印公有变量 这是公有变量,我们可以直接访问 class Person() : __name = 'test'#给私有变量name赋值 a = Person() print(a.name)...
  • 一、私有变量的定义在Python中,有以下几种方式来定义变量:xx:公有变量_xx:单前置下划线,私有化属性或方法,对象和子类可以访问,from somemodule import *禁止导入__xx:双前置下划线,私有化属性或方法,...
  • 我们先上结论┗( ▔, ▔ )┛结论__xx__:这种系统属性或方法,还没想好怎么测试,我们就看看用户自定义的吧variatefrom module import *外继承xx :公有变量✔✔✔_xx :单前置下划线✘✔✔__xx:双前置下划线✘✘...
  • 1、XX:公有变量 2、_XX:私有化属性或方法,不能通过from modules import *导入,只有对象或子类可以访问。 3、__XX:避免与子类中的属性或方法冲突,不能够直接访问,但是可以通过"_类名__XX"的方式...
  • 为了控制对的成员的访问权限,的成员分:公有、保护 、私有三种类型。一、公有成员任何时候都可以访问的成员即为公有成员,在定义公有成员时没有什么特殊的要求。二、保护成员名称以一条下划线“_”开头的...
  • python 公有属性、私有属性、公有方法、私有方法 #!/usr/bin/env python # -*- encoding: utf-8 -*- """ @Introduce : python 公有属性、私有属性、公有方法、私有方法       &...
  • 本文实例讲述了Python 私有属性和私有方法。分享给大家供大家参考,具体如下: xx:公有变量 _xx:公有变量或方法,不能通过import导入其他模块(只有模块内部使用)。对象和子类可以访问 __xx:私有变量或方法(伪...
  • 我有老婆,你不能直接知道我老婆是谁,你只有问我才会知道,即我的私有属性只有我知道】在python中定义私有变量私有方法只需要在变量名或函数名前加上 “__”两个下划线在内部的方法中使用时 self.__变量...
  • python中定义私有变量只需要在变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就是私有的了。在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__mem...
  • Python是个开放的语言,默认情况下所有的属性和方法都是公开的 或者叫公有方法,不像C++和 Java中有明确的public,private 关键字来区分私有公有Python默认的成员函数和成员变量都是公开的,的私有属性指只有在...
  • 公有变量直接访问>>> class Student(object):... def __init__(self,name,score):... self.name = name... self.score = score... def print_score(self):... print('...
  • 私有函数与私有变量中的私有是什么意思? 简单理解就是独自拥有、不公开、不分享的意思。放到函数与变量中就是独自拥有的函数与独自拥有的变量,并且不公开。这样我们就理解了什么是私有函数与私有变量
  • Python私有变量的定义和用法

    千次阅读 2019-10-12 16:01:19
    大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (例如: _spam) 应该被当作是 API 的非公有部分 (无论它是函数、方法或是数据成员)。 为了保证对于类私有成员的有效使用(例如避免名称与派生所定义...
  • Python也可以设置受保护、私有类型的变量or方法受保护类型的变量、方法一般称为:protected变量#!/usr/bin/env python# -*- coding: utf-8 -*-class protected:_protected = "受保护变量"name = "test"def test...
  • 1、的内置变量 class Employee: ''' 员工的基本信息 ''' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 de...
  • 除了保留字,Python 中还为的名字做了某些特殊准备,就是“专有”的范畴。 以“__”双划线开头的,将这命名的函数/方法称之为“私有函数”。所谓“私有”,即: 私有函数不可以从它们的模块外面被调用 私有类...
  • python类定义私有成员和私有方法

    千次阅读 2022-04-15 22:10:07
    0 引言 在任何语言中,都会规定某些对象(属性...对于私有成员和私有方法, python不像C++那样有专门的关键字定义,如private。但是也有一些方法可以做到, 那就是以双下划线__开头(但不以双下划线结尾)的成员或方法是

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,650
精华内容 4,260
热门标签
关键字:

python类私有公有变量