• Python全栈之路系列之面向对象成员修饰符


     

    成员修饰符就是设置类的成员有些是公开的有些是私有的,公开的是在外部通过对象或者类可以调用,但是私有的只能通过类的内部才可以调用。

    • 静态字段修饰
    #!/usr/bin/env python
    # _*_coding:utf-8 _*_
    
    class Foo:
        # 公有的静态字段
        ClassMembers = "公开的"
        # 私有的静态字段
        __ClassMembers = "私有的"
    
    # 执行公有的静态字段
    print(Foo.ClassMembers)
    
    # 执行私有的静态字段
    print(Foo.__ClassMembers)
    
    公开的
    Traceback (most recent call last):
        print(Foo.__ClassMembers)
    AttributeError: type object 'Foo' has no attribute '__ClassMembers'
    
    Process finished with exit code 1
    

    私有的是不能够直接调用的,需要在类中进行调用,如下:

    #!/usr/bin/env python
    # _*_coding:utf-8 _*_
    
    class Foo:
    
        # 私有的静态字段
        __ClassMembers = "私有的"
    
        # 通过类中的方法调用私有的静态字段进行输出
        def Members(self):
            print(Foo.__ClassMembers)
    
    # 创建一个对象
    obj = Foo()
    
    # 执行类中的Members方法
    obj.Members()
    

    执行结果

    私有的
    
    Process finished with exit code 0
    

    普通字段修饰

    #!/usr/bin/env python
    # _*_coding:utf-8 _*_
    
    class Foo:
    
        # 类的构造方法
        def __init__(self, url):
    
            # 普通字段
            self.url = url
    
            # 私有普通字段
            self.__Blog = url
    
    # 创建一个对象,传入一个值
    obj = Foo("http://www.baidu.com")
    
    # 普通字段
    print(obj.url)
    
    # 私有的普通字段
    print(obj.__Blog)
    

    输出

    http://www.baidu.com
    Traceback (most recent call last):
        print(obj.__Blog)
    AttributeError: 'Foo' object has no attribute '__Blog'
    
    Process finished with exit code 1
    

    若要输出私有的普通字段,需要在类中调用私有的普通字段进行输出

    #!/usr/bin/env python
    # _*_coding:utf-8 _*_
    
    class Foo:
    
        # 类的构造方法
        def __init__(self, url):
    
            # 私有普通字段
            self.__Blog = url
    
            # 直接在狗仔方法没输出传入的URL
            print(self.__Blog)
    
    # 创建一个对象,传入一个值
    obj = Foo("http://www.baidu.com")
    

    输出结果

    http://www.baidu.com
    

    对于私有的成员,只能够在类中进行访问,即使是继承关系也不可以,测试如下:

    #!/usr/bin/env python
    # _*_coding:utf-8 _*_
    
    class Foo:
    
        # 父类的构造方法
        def __init__(self):
    
            # 私有普通字段
            self.__Blog = "http://www.baidu.com"
    
    # Bar继承了Foo类,
    class Bar(Foo):
    
        # 由于Bar类没有构造方法,所以会执行他父类的构造方法
    
        # 创建一个类方法fetch
        def fetch(self):
            # 输出self.__Blog
            print(self.__Blog)
    
    # 创建一个对象
    obj = Bar()
    
    # 执行类中的fetch方法
    obj.fetch()
    

    输出

    AttributeError: 'Bar' object has no attribute '_Bar__Blog'
    

    对于普通方法、静态方法类方法也是如此,只要成员前面加两个下划线就代表是私有的,即外部不能够访问,只有内部才可以访问。

    通过特殊的方法去访问类中的私有成员

    #!/usr/bin/env python
    # _*_coding:utf-8 _*_
    
    class Foo:
    
        # 父类的构造方法
        def __init__(self):
    
            # 私有普通字段
            self.__Blog = "http://www.baidu.com"
    
    # 创建一个对象
    obj = Foo()
    
    # 通过特殊的方法访问
    print(obj._Foo__Blog)
    # 一个下划线,一个类名,私有的变量名
    

    输出

    http://www.baidu.com
  • 相关阅读:
    POJ-1035 Spell checker---字符串处理
    hdu-3572 Task Schedule---最大流判断满流+dinic算法
    BZOJ4826: [Hnoi2017]影魔
    BZOJ4825: [Hnoi2017]单旋
    BZOJ3504: [Cqoi2014]危桥
    BZOJ4407: 于神之怒加强版
    BZOJ2818: Gcd
    BZOJ4542: [Hnoi2016]大数
    BZOJ4540: [Hnoi2016]序列
    BZOJ4537: [Hnoi2016]最小公倍数
  • 原文地址:https://www.cnblogs.com/ethereala/p/9012222.html
Copyright © 2020-2023  润新知