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() #不能访问
总结:
对于这些私有成员来说,他们只能在类的内部使用,不能再类的外部以及派生类中使用.
非要访问私有成员的话,可以通过 对象._类__属性名,但是绝对不允许!!!
为什么可以通过._类__私有成员名访问呢?因为类在创建时,如果遇到了私有成员(包括私有静态字段,私有普通字段,私有方法)它会将其保存在内存时自动在前面加上_类名.