"""成员修饰符
公有成员:在外部可以调用,可以继承,子类可以调用父类的公有成员
私有成员:在外部不可以调用,只能间接调用(通过类内部的方法调用),不可以继承,子类不能调用父类的私有成员。使用'__'两个下划线开头
"""
# 示例1,变量的公有私有,name是公有成员,age是私有成员,bar在内部调用私有成员__age
class Foo1:
def __init__(self, name, age):
self.name = name
self.__age = age
def bar(self):
return self.__age
# 实例化
foo1 = Foo1('abc', 20)
# 公有成员可以在外部直接调用
print(foo1.name)
# 私有成员在外部不能直接调用,下面命令会报错
# print(foo1.__age)
# 私有变量只是把变量重命名了,通过下面方法可以调用,永远不要这么去调用
print(foo1._Foo1__age)
# 私有字段可以间接访问
print(foo1.bar())
# 示例2、方法的公有私有,bar1是公有成员,__bar2是私有成员,bar3在类内部调用私有成员__bar2。
class Foo2:
def bar1(self):
return 'hello bar1'
def __bar2(self):
return 'hello bar2'
def bar3(self):
return self.__bar2()
# 实例化
foo2 = Foo2()
# 公有成员可以在外部直接调用
print(foo2.bar1())
# 私有成员在外部不能直接调用,下面命令会报错
# print(foo1.__bar2())
# 私有成员可以间接调用
print(foo2.bar3())
# 私有方法只是把方法重命名了,通过下面方法可以调用,永远不要这么调用
print(foo2._Foo2__bar2())
# 示例3、继承
class F:
def __init__(self):
self.age1 = 18
self.__age2 = 20
class S(F):
def __init__(self):
super(S, self).__init__() # 执行父类的__init__方法
def bar1(self):
return self.age1
def bar2(self):
return self.__age2
# 实例化
obj = S()
# 父类公有成员,可以继承
print(obj.bar1())
# 父类私有成员,不能继承,会报错
# print(obj.bar2())
"""
补充
私有成员不会被子类重写
"""
# 例子
class A(object):
def __method(self):
print("I'm a method in A")
def method(self):
self.__method()
a = A()
a.method()
class B(A):
def __method(self):
print("I'm a method in B")
b = B()
b.method()
"""
就像我们看到的一样,B.method()不能调用B.__method的方法。实际上,它是"__"两个下划线的功能的正常显示。
因此,在我们创建一个以"__"两个下划线开始的方法时,这意味着这个方法不能被重写,它只允许在该类的内部中使用。
在Python中如是做的?很简单,它只是把方法重命名了,如下:
"""
a = A()
a._A__method()
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。