Python面向对象(公有与私有)

面向对象的私有与公有

对于每一个类的成员而言都有两种形式:

公有成员,在任何地方都能访问

私有成员,只有在类的内部才能方法

私有成员和公有成员的访问限制不同:

静态字段(静态变量)

公有静态字段:类可以访问;类内部可以访问;派生类中可以访问

私有静态字段:仅类内部可以访问;

公有静态字段

class A:

    name = "公有静态字段"

    def func(self):

        print(A.name)

class B(A):

    def show(self):

        print(A.name)

print(A.name)    #类访问

obj = A() 

obj.func()       #类内部可访问

obj_son = B()

obj_son.show()   #派生类中可访问

私有静态字段

class A:

    __name = "私有静态字段"

    def func(self):

        print(A.__name)

class B(A):

    def show(self):

        print(A.__name)

obj = A()

obj_2 = B()

#print(obj.__name)   #在外部访问报错

obj.func()  #类内部可以访问

obj_2.show()  #不可在派生类中访问

AttributeError: type object 'A' has no attribute '_B__name'

普通字段(对象属性)

公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问

私有普通字段:仅类内部可以访问;

公有普通字段

class A:

    def __init__(self):

        self.foo = "公有字段"

    def func(self):

        print(self.foo)

class B(A):

    def show(self):

        print(self.foo)

obj = A()

print(obj.foo)

obj.func()

obj_2 = B()

obj_2.show()

私有普通字段

class A:

    def __init__(self):

        self.__foo = "私有字段"

    def func(self):

        print(self.__foo)

class B(A):

    def show(self):

        print(self.__foo)

obj = A()

# print(obj.__foo)   #外部访问报错

obj.func()   #类内部访问

# obj_2 = B()

# obj_2.show()  #派生类中访问报错

方法

公有方法:对象可以访问;类内部可以访问;派生类中可以访问

私有方法:仅类内部可以访问;

公有方法

class A:

    def __init__(self):

        pass

    def add(self):

        print('A')

class B(A):

    def show(self):

        print("B")

    def func(self):

        self.show()

obj = B()

obj.show()

obj.func()

obj.add()

私有方法

class A:

    def __init__(self):

        pass

    def __add(self):

        print('A')

class B(A):

    def __show(self):

        print("B")

    def func(self):

        self.__show()

obj = B()

obj.__show()   #不能访问

obj.func()    #能访问

obj.__add()  #不能访问

总结:

对于这些私有成员来说,他们只能在类的内部使用,不能再类的外部以及派生类中使用.

非要访问私有成员的话,可以通过 对象._类__属性名,但是绝对不允许!!!

为什么可以通过._类__私有成员名访问呢?因为类在创建时,如果遇到了私有成员(包括私有静态字段,私有普通字段,私有方法)它会将其保存在内存时自动在前面加上_类名.

posted @ 2018-06-25 16:18  杨灏  阅读(2728)  评论(0编辑  收藏  举报