前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >八、python学习笔记-面向对象-成员修饰符

八、python学习笔记-面向对象-成员修饰符

原创
作者头像
堕落飞鸟
发布2022-01-14 09:24:57
2090
发布2022-01-14 09:24:57
举报
文章被收录于专栏:飞鸟的专栏
代码语言:javascript
复制
"""成员修饰符
公有成员:在外部可以调用,可以继承,子类可以调用父类的公有成员
私有成员:在外部不可以调用,只能间接调用(通过类内部的方法调用),不可以继承,子类不能调用父类的私有成员。使用'__'两个下划线开头
"""

# 示例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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档