前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python - 面向对象编程 - 公共属性、保护属性、私有属性

Python - 面向对象编程 - 公共属性、保护属性、私有属性

作者头像
小菠萝测试笔记
发布2021-09-07 16:33:03
2K0
发布2021-09-07 16:33:03
举报

公共属性

在 Python 的类里面,所有属性和方法默认都是公共的

代码语言:javascript
复制
class PoloBlog:
    # 公共属性
    sum = 0

    # 构造方法
    def __init__(self, name):
        self.name = name

    # 公共方法
    def test(self):
        ...

但Python也可以设置受保护、私有类型的变量or方法

私有类型的属性、方法

  • 在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到
  • 私有属性:就是对象不希望公开访问的属性
  • 私有方法:就是对象不希望公开访问的方法
定义方式,类图

在属性、方法名前加两个下划线就是私有属性、私有方法了

代码
代码语言:javascript
复制
# 私有属性、方法
class Person:

    # 构造方法
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    # 实例方法
    def pinrtMsg(self):
        print("name:", self.name, " age:", self.__age)

    # 私有方法
    def __getAge(self):
        print("age is ", self.__age)


person = Person("小菠萝", 24)
# 直接调用私有属性、私有方法 - 会报错
print(person.__age)
print(person.__getAge)



# 输出结果
    print(person.__age)
AttributeError: 'Person' object has no attribute '__age'

    print(person.__getAge)
AttributeError: 'Person' object has no attribute '__getAge'
看看 Pycharm 的代码联想

压根不会联想,因为是私有属性、私有方法,不允许在对象外部被使用

通过公共方法访问私有属性
代码语言:javascript
复制
person = Person("小菠萝", 24)
person.printMsg()


# 输出结果
name: 小菠萝  age: 24
类属性私有化
代码语言:javascript
复制
# 类属性的私有化
class Person:
    __sum = 0

    @classmethod
    def getSum(cls, num):
        # 调用私有类方法
        cls.__sumAdd(num)
        print(cls.__sum)

    @classmethod
    def __sumAdd(cls, num):
        cls.__ 

重点

  • 子类无法访问父类的私有变量、方法
  • 私有变量只有本类的内部能直接调用
  • But!外部真的不能访问吗?
伪私有属性和私有方法
  • 其实 Python 中,并没有真正意义上的私有,仍然可以在外部访问私有属性、私有方法
  • 因为,在给私有属性、方法命名时,实际是对名称做了一些特殊处理,使得外界无法访问到
  • 处理方式:在名称前面加上 ,私有属性、方法就会变成 _类名__名称

_类名

代码语言:javascript
复制
# 间接调用
class Person:
    __sum = 0

    # 构造方法
    def __init__(self, name):
        self.__name = name

    # 私有方法
    def __getName(self):
        print("name is ", self.__name)


# 调用类私有属性
print(Person._Person__sum)

person = Person("小菠萝")

# 调用私有属性
print(person._Person__name)
# 调用私有方法
person._Person__getName()



# 输出结果
0
小菠萝
name is  小菠萝

无论是类对象还是实例对象,都可以通过 ._类名__名称 来调用私有属性、方法,这算是一种间接调用

受保护类型的属性、方法

  • 受保护类型一般会称为:protect 属性,学过 Java 的应该都了解
  • 在属性和方法前加一个下划线就是 protect 类型了,私有类型是两个下划线
代码语言:javascript
复制
# 受保护类型
class PoloBlog:
    _sum = 0.0

    # 构造方法
    def __init__(self, name):
        self._name = name

    # 保护方法
    def _printName(self):
        print(self._name)

    # 类方法
    @classmethod
    def _classMethod(cls):
        print(cls._sum)


blog = PoloBlog("小菠萝")
# 打印保护类型的类属性
print(PoloBlog._sum)

# 打印保护类型的实例属性
print(blog._name)

# 实例对象调用保护类型的实例方法
blog._printName()

# 实例对象调用保护类型的类方法
blog._classMethod()

# 类对象调用保护类型的类方法
PoloBlog._classMethod()


# 输出结果
0.0
小菠萝
小菠萝
0.0
0.0

知识点

  • 父类的 protect 属性,子类可以继承
  • 实例对象、类对象都能直接调用 protect 属性、方法

总的来说,和公共变量没有什么特别大的区别

总结

无论是受保护型变量还是私有变量,其实在外部还是能访问的,所以并不能真正控制属性的访问权限

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-08-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 公共属性
  • 私有类型的属性、方法
    • 定义方式,类图
      • 代码
        • 看看 Pycharm 的代码联想
          • 通过公共方法访问私有属性
            • 类属性私有化
            • 重点
              • 伪私有属性和私有方法
              • 受保护类型的属性、方法
                • 知识点
                • 总结
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档