面向对象成员修饰符

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

静态字段修饰

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

class Foo:
    # 公有的静态字段
    ClassMembers = "公开的"
    # 私有的静态字段
    __ClassMembers = "私有的"

# 执行共有的静态字段
print(Foo.ClassMembers)
# 执行私有的静态字段
print(Foo.__ClassMembers)
➜  python_test python3 023-exercise-1.py
公开的
Traceback (most recent call last):
  File "023-exercise-1.py", line 10, in <module>
    print(Foo.__ClassMembers)
AttributeError: type object 'Foo' has no attribute '__ClassMembers'

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

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

class Foo:
    # 私有的静态字段
    __ClassMembers = "私有的"
    # 通过类中的方法调用私有的静态字段进行输出
    def Members(self):
        print(Foo.__ClassMembers)
# 创建一个对象
obj = Foo()
# 执行类中的Members方法
obj.Members()

执行结果

➜  python_test python3 023-exercise-2.py
私有的

普通字段修饰

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

class Foo:
    # 类的构造方法
    def __init__(self,url):
        # 普通字段
        self.url = url
        # 私有字段
        self.__Blog = url
# 创建一个对象,传入一个值
obj = Foo("http://yjj.top")

# 普通字段
print(obj.url)

#私有的普通字段
print(obj.__Blog)

输出

➜  python_test python3 023-exercise-3.py
http://yjj.top
Traceback (most recent call last):
  File "023-exercise-3.py", line 10, in <module>
    print(obj.__Blog)
AttributeError: 'Foo' object has no attribute '__Blog'

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

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

class Foo:
    # 类的构造方法
    def __init__(self,url):

        # 私有普通字段
        self.__Blog = url
        # 直接在构造方法里面输出传入的url
        print(self.__Blog)

# 创建一个对象,传入一个值
obj = Foo("http://yjj.top")

输出

➜  python_test python3 023-exercise-4.py
http://yjj.top

对于私有成员,只能够在类中进行访问,即使继承关系也不可以

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

class Foo:
    # 父类的构造方法
    def __init__(self):
        # 私有普通字段
        self.__Blog = "http://yjj.top"

# Bar继承了Foo类
class Bar(Foo):
    # 由于Bar类没有构造方法,所以会执行父类的构造方法

    # 创建了一个类方法fetch
    def fetch(self):
        # 输出self.__Blog
        print(self.__Blog)
# 创建一个对象
obj = Bar()

# 执行类中的fetch方法
obj.fetch()

输出

➜  python_test python3 023-exercise-5.py
Traceback (most recent call last):
  File "023-exercise-5.py", line 15, in <module>
    obj.fetch()
  File "023-exercise-5.py", line 11, in fetch
    print(self.__Blog)
AttributeError: 'Bar' object has no attribute '_Bar__Blog'

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

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

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

class Foo:
    def __init__(self):
        # 私有普通字段
        self.__Blog = "http://yjj.top"

# 创建一个对象
obj = Foo()

# 通过特殊的方法访问,一个下划线,一个类名,私有变量名
print(obj._Foo__Blog)

输出

➜  python_test python3 023-exercise-6.py
http://yjj.top