美文网首页
Python语法中容易混淆的地方-类属性/实例属性/公有变量/私

Python语法中容易混淆的地方-类属性/实例属性/公有变量/私

作者: ztfdeveloper | 来源:发表于2017-09-09 17:32 被阅读0次

    容易混淆的地方#

    • xx: 公有变量
    • _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
    • __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
    • xx:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己发明这样的名字
    • xx_:单后置下划线,用于避免与Python关键词的冲突

    通过name mangling(名字重整(目的就是以防子类意外重写基类的方法或者属性)如:_Class__object)机制就可以访问private了。

    公有变量

    #coding=utf-8
    class Person(object):
        address = '北京' #类属性
        def __init__(self, new_name):
            self.name = new_name #实例属性
    
    p = Person('Tom')
    print(Person.address) #打印类属性
    print(p.name) #打印实例属性
    

    私有变量

    私有变量_x

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

    Person.py中定义_age = 18,然后终端中输入iPython3打开命令交互模式,调用Person.py中的_age会出现崩溃.

    私有变量调用崩溃

    但是在命令交互模式通过import Person调用就不会出现崩溃

    私有变量调用不崩溃

    因为通过import Person是把Person导入,在调用时是通过Person来调用的,不是外部调用

    _x总结

    • 父类中属性名为__名字的,子类不继承,子类不能访问
    • 如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性
    • _名的变量、函数、类在使用from xxx import *时都不会被导入

    私有变量__x

    • __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
    class Person(object):
        def __init__(self, new_name):
            self.__name = new_name
        #set方法设置__name
        def set_name(self, new_name):
            self.__name = new_name
        #get方法获取__name
        def get_name(self):
            return self.__name
    
    p = Person()
    print(p.get_name()) #通过get_name方法返回__name,打印实例属性__name
    #print(p.__name) #直接调用__name会崩溃
    

    也可以通过property来实现,不做解释

    • Python没有真正的私有变量。内部实现上,是将私有变量进行了转化,规则是:_<类名><私有变量>
      重定向

    可以看到_Person__age就是Python自动转化的

    魔法对象或属性

    • xx:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己发明这样的名字

    他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的。

    不要去尝试的方式

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

    我的博客

    相关文章

      网友评论

          本文标题:Python语法中容易混淆的地方-类属性/实例属性/公有变量/私

          本文链接:https://www.haomeiwen.com/subject/fskajxtx.html