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

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

公共属性


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


class PoloBlog:
    # 公共属性
    sum = 0
    # 构造方法
    def __init__(self, name):
        self.name = name
    # 公共方法
    def test(self):
        ...


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

 

私有类型的属性、方法


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

 

定义方式,类图

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

image.png


代码

# 私有属性、方法
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 的代码联想

image.png

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

 

通过公共方法访问私有属性

person = Person("小菠萝", 24)
person.printMsg()
# 输出结果
name: 小菠萝  age: 24


类属性私有化

# 类属性的私有化
class Person:
    __sum = 0
    @classmethod
    def getSum(cls, num):
        # 调用私有类方法
        cls.__sumAdd(num)
        print(cls.__sum)
    @classmethod
    def __sumAdd(cls, num):
        cls.__ 


重点


  • 子类无法访问父类的私有变量、方法
  • 私有变量只有本类的内部能直接调用
  • But!外部真的不能访问吗?

 

伪私有属性和私有方法

  • 其实 Python 中,并没有真正意义上的私有,仍然可以在外部访问私有属性、私有方法
  • 因为,在给私有属性、方法命名时,实际是对名称做了一些特殊处理,使得外界无法访问到
  • 处理方式:在名称前面加上 _类名 ,私有属性、方法就会变成 _类名__名称


# 间接调用
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 类型了,私有类型是两个下划线


# 受保护类型
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 属性、方法

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

 

总结


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

相关文章
|
4天前
|
Python
python基础篇:面向对象编程
python基础篇:面向对象编程
21 0
|
4天前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
4天前
|
Python
python属性错误(AttributeError)
【5月更文挑战第2天】python属性错误(AttributeError)
9 1
|
4天前
|
算法 Java 程序员
[重学Python] Day6 面向对象编程 基础
面向对象编程基础讲解,包括类与对象的概念,类是对象的模板,对象是类的实例。Python中使用`class`定义类,通过`__init__`初始化对象。创建对象并调用方法如`drive`和`target_client`。访问权限在Python中相对宽松,使用单下划线表示受保护的属性。面向对象的三大支柱是封装、继承和多态,封装是隐藏实现细节,仅暴露简单接口。提供了数字时钟和平面上的点的类定义作为练习示例。
14 0
|
4天前
|
Python
Python常见的魔术方法和魔术属性(二)
Python常见的魔术方法和魔术属性(二)
|
4天前
|
数据库 Python
Python常见的魔术方法和魔术属性(一)
Python常见的魔术方法和魔术属性(一)
|
4天前
|
运维 算法 Shell
第六章 Python类(面向对象编程)
第六章 Python类(面向对象编程)
|
4天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
4天前
|
设计模式 算法 程序员
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践
|
4天前
|
数据安全/隐私保护 Python
Python从入门到精通——2.2.1深入学习面向对象编程:类和对象的定义
Python从入门到精通——2.2.1深入学习面向对象编程:类和对象的定义