访问python中的私有变量

访问python中的私有变量

要给实习生培训python, 话说我自己都不怎么会用, 不能误人子弟, 再看看一些python中的概念吧.

看到类以及私有变量时, 想到以前看过文章, 说Python里面有私有函数也能被调用, 就顺手搜索了一下, stackoverflow有个问题就是问这个的. Why are Python‘s ‘private‘ methods not actually private?

HOW

类里面用两个下划线__打头的, 就是私有变量/函数 (后面会说到其实不是这样的)

照着写一份python代码跑跑看

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class A(object):

    def __init__(self):
        super(A, self).__init__()
        self.name = "childe"
        self.__age = 28

    def pub_f(self):
        print ‘this is a public function‘

    def __pri_f(self):
        print ‘this is a private function‘

def main():
    a = A()
    a.pub_f()
    print a.name
    try:
        a._pri_f()
    except AttributeError as e:
        print e
    try:
        print a.__age
    except AttributeError as e:
        print e

    print dir(a)

if __name__ == ‘__main__‘:
    main()

运行结果如下:

this is a public function
childe
‘A‘ object has no attribute ‘__pri_f‘
‘A‘ object has no attribute ‘__age‘
[‘_A__age‘, ‘_A__pri_f‘, ‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘, ‘name‘, ‘pub_f‘]

可以看到直接调用私有变量/函数失败了. 但是dir(a)的时候, 有‘Aage‘, ‘A_prif’ 这两个东西, 来调用一下.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class A(object):

    def __init__(self):
        super(A, self).__init__()
        self.name = "childe"
        self.__age = 28

    def pub_f(self):
        print ‘this is a public function‘

    def __pri_f(self):
        print ‘this is a private function‘

def main():
    a = A()
    try:
        a._A__pri_f()
    except AttributeError as e:
        print e
    try:
        print a._A__age
    except AttributeError as e:
        print e

if __name__ == ‘__main__‘:
    main()

跑一下, 正常输出了.

this is a private function
28

WHY

以上还都是PO主的问题以及他的代码, 他问的也不是how, 而是why. 下面那个回答才让我开了眼界(好吧, 是我太无知了). 这次真的是真的copy代码:

class Foo(object):

    def __init__(self):
        self.__baz = 42

    def foo(self):
        print self.__baz

class Bar(Foo):

    def __init__(self):
        super(Bar, self).__init__()
        self.__baz = 21

    def bar(self):
        print self.__baz

x = Bar()
x.foo()
x.bar()
print x.__dict__

运行结果:

42
21
{‘Barbaz‘: 21, ‘Foo__baz‘: 42}

也就是说, 子类的私有变量与父类里面同名的私有变量共存了.. 以前真的不知道还可以这样.

同时, [Alya] 还回答了这个问题,

The name scrambling is used to ensure that subclasses don‘t accidentally override the private methods and attributes of their superclasses. It‘s not designed to prevent deliberate access from outside.

为比我E文还差的比我还懒的同学翻译一下, 就是说
私有变量不是为了防止从外部调用, 而是为了避免被子类不小心重写.

鉴于Alya只回答过这一个问题, 所以还是去官网看一下类的文档吧.

看过之后, 有种被调戏的感觉.
官网明确说了,python中并没有私有变量, 一个下划线打头表明大家把它”当做”私有变量对待吧, “建议”不要从外部直接改.
至少两个下划线打头, 并以最多一个下划线结尾的变量, 比如说spam会被重命名为_classnamespam

嗯, 讲python的时候, 又可以多说一点儿了.

C++

C++里面的私有变量应该也是能访问/修改的.
因为类实例是在栈空间里面的, 类实例里面的变量, 不管是私有还是公有, 都顺序排列在内存中.

#include <iostream>

using namespace std;

class Person{
    public:
        Person(){
            this->age = 28;
        }
    private:
        int age;
};

int main(int argc, const char *argv[])
{
    Person p;
    cout << *(int*)(&p) << endl;
    return 0;
}
% ./a.out
28

不知道怎么调用私有函数, 但我想也是有办法的吧?

时间: 2024-11-08 09:11:09

访问python中的私有变量的相关文章

在拷贝构造函数中为什么可以访问引用对象的私有变量? [问题点数:0分]

在拷贝构造函数中为什么可以访问引用对象的私有变量? 例如: class Point { public:         Point(int xx=0,int yy=0){X=xx;Y=yy;}         Point(Point &p); private:         int X,Y; }; Point::Point(Point &p) {         X=p.X;         Y=p.Y; } 更多 0 分享到: 相关主题推荐: 对象 class yy x 相关帖子推荐:

小鱼提问3 static方法中可以访问某个类的私有变量吗(不通过反射的其他非正常手段)?什么情况下可以?

? 1 2 3 4 5 6 7 8 9 10 11 12 class Student {     private string _name;     public int Age = 0;     public static void Test()     {         Student stu = new Student();         <span style="color: rgb(255, 0, 0);"><strong>stu._name =

javascript在私有作用域中定义私有变量和私有函数 (1)

javascript没有私有成员,但是有私有变量,所有对戏那个属性都是公有的 任何在函数中定义的变量,都可以认为是私有变量,因为函数内部不能访问. 私有变量包括:函数的参数.局部变量.函数内部定义的其他函数 - 在私有作用域中定义私有变量和私有函数 function MyObject(){ //私有变量和私有函数 var privateVariable=10; function privateFunction(params) { return false } //特权方法----有权访问私有变量

函数中的私有变量和特权方法

定义 [1][私有变量] 任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数外部访问这些变量.私有变量包括函数的参数.局部变量和在函数内部定义的其他函数 [2][特权方法] 如果在函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量.而利用这一点,就可以创建用于访问私有变量的公有方法.有权访问私有变量和私有函数的公有方法称为特权方法. 创建方式 [1][构造函数] 在构造函数内部定义所有私有变量和函数.然后,创建能够访问这些私有成员的特权方法.能够在构造函数中定义特权方法

ES6 class类中定义私有变量

ES6 class类中定义私有变量 class类的不足 看起来, es6 中 class 的出现拉近了 JS 和传统 OOP 语言的距离.但是,它仅仅是一个语法糖罢了,不能实现传统 OOP 语言一样的功能.在其中,比较大的一个痛点就是私有变量问题. 何为私有变量?私有变量就是只能在类内部访问的变量,外部无法访问的变量.在开发中,很多变量或方法你不想其他人访问,可以定义为私有变量,防止被其他人使用.在 Java 中,可以使用 private 实现私有变量,但是可惜的是, JS 中并没有该功能. 来

python 类的私有变量和私有方法

#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/11/08 8:46 # @Author : lijunjiang # @File : class3.py """ 类的私有变量和私有方法 在Python中可以通过在属性变量名前加上双下划线定义属性为私有属性 特殊变量命名 1. _xx 以单下划线开头的表示的是protected类型的变量.即保护类型只能允许其本身与子类进行访问.若内部变量标示,如: 当使用

struts2 action中的私有变量

struts2 框架中action 中都有一些私有变量来接收ajax传过来的值,比如:有个page(private String page;)接收传过来的页数,当ajax访问这个action 而没有传过来page参数时,page = null ,而不是""

为什么C++中复制构造函数可以调取其他对象中的私有变量

私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有成员变量,因而,产生了困惑.下面以具体实例进行说明: 疑惑:为什么第26行和第32行代码可以编译通过,而第39行和第40行代码会产生编译错误? 1 class CTest { 2 public: 3 CTest(int i); 4 CTest(const CTest& rhs); 5 CTest

OC中的私有变量和私有方法

在类的实现即.m文件中也可以声明成员变量,但是因为在其他文件中通常都只是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private得.在 .m中定义的成员变量不能和它的头文件.h中的成员变量同名,在这期间使用@public等关键字也是无效的 上面一堆废话~~~ 简单说就是.m文件中的成员只能自己使用,外面引用的都不可以用 方法也是一样的,没有在.h文件中声明,只在.m文件中实现 子类是无法继承的如果想访问,在当前类中使用self访问