Python - 面向对象编程 - @property (上)

简介: Python - 面向对象编程 - @property (上)

前言


  • 前面讲到实例属性的时候,我们可以通过 实例对象.实例属性 来访问对应的实例属性
  • 但这种做法是不建议的,因为它破坏了类的封装原则
  • 正常情况下,实例属性应该是隐藏的,只允许通过类提供的方法来间接实现对实例属性的访问和操作


class PoloBlog:
    # 构造方法
    def __init__(self, name):
        self.name = name
blog = PoloBlog("小菠萝")
# 破坏了封装原则
print(blog.name)
blog.name = "啊?"
print(blog.name)
# 输出结果
小菠萝
啊?


getter、setter 方法


  • 不破坏类封装原则的基础上,操作实例属性
  • 写过 java 的话应该知道,java 的类可以自动生成对属性的操作方法,一个是 get,另一个是 set(一般称为 getter、setter 方法)
  • python 中虽然不能自动生成,但也可以自己写哦


class PoloBlog:
    # 构造方法
    def __init__(self, name):
        self.name = name
    # set 属性的方法【setter】
    def setName(self, name):
        self.name = name
    # get 属性的方法【getter】
    def getName(self):
        return self.name
blog = PoloBlog("小菠萝")
# 获取 blog 实例对象的 name 实例属性
print(blog.getName())
# 设置 name 实例属性
blog.setName("新的小菠萝")
print(blog.getName())
# 输出结果
小菠萝
新的小菠萝


这样跟 java 的写法就差不多了,但还是有点麻烦

 

property() 方法的诞生


可以实现在不破坏类封装原则的前提下,让开发者依旧使用 对例对象.属性 的方式操作类中的属性

 

基本使用格式

属性名 = property(fget=None, fset=None, fdel=None, doc=None)

  • fget:用于获取属性的方法
  • fset:用于设置属性的方法
  • fdel:用于删除属性的方法
  • doc:属性的说明文档字符串

 

代码栗子

# property() 函数
class PoloBlog:
    # 构造函数
    def __init__(self, name):
        self.__name = name
    # setter
    def setName(self, name):
        self.__name = name
    # getter
    def getName(self):
        return self.__name
    # del
    def delName(self):
        self.__name = "xxx"
    # property()
    name = property(getName, setName, delName, "小菠萝测试笔记")
# 调用说明文档
# help(PoloBlog.name)
print(PoloBlog.name.__doc__)
blog = PoloBlog("小菠萝")
# 自动调用 getName()
print(blog.name)
# 自动调用 setName()
blog.name = "新的小菠萝"
print(blog.name)
# 自动调用 delName()
del blog.name
print(blog.name)
# 输出结果
小菠萝测试笔记
小菠萝
新的小菠萝
xxx


getName return 的是私有属性 __name,注意不是 name,不然会陷入死循环

 

注意

property() 方法的四个参数都是默认参数,可以不传参

# property() 函数
class PoloBlog:
    # 构造函数
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    # setter name
    def setName(self, name):
        self.__name = name
    # getter name
    def getName(self):
        return self.__name
    # del name
    def delName(self):
        self.__name = "xxx"
    # setter age
    def setAge(self, age):
        self.__age = age
    # getter age
    def getAge(self):
        return self.__age
    # property()
    name = property(getName, setName, delName, "小菠萝测试笔记")
    # 没有 fdel、doc
    age = property(getAge, setAge)
blog = PoloBlog("小菠萝", 14)
print(blog.age)
blog.age = "24"
print(blog.age)
del blog.age
print(blog.age)
# 输出结果
14
24
    del blog.age
AttributeError: can't delete attribute 


因为 property() 没有传 fdel 方法,所以无法删除属性,它是一个可读写,不可删的属性

 

其他传参解析

name = property(getName)    # name 属性可读,不可写,也不能删除

name = property(getName, setName,delName)    #name属性可读、可写、也可删除,就是没有说明文档

相关文章
|
4天前
|
Python
python基础篇:面向对象编程
python基础篇:面向对象编程
21 0
|
4天前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
4天前
|
Python
Python中的面向对象
【5月更文挑战第4天】面向对象编程(OOP)是Python的核心,涉及类与对象、封装、继承和多态。类是对象的模板,对象则是类的实例。例如,`Person`类有`__init__`构造方法和`greet`方法。
15 3
|
4天前
|
算法 Java 程序员
[重学Python] Day6 面向对象编程 基础
面向对象编程基础讲解,包括类与对象的概念,类是对象的模板,对象是类的实例。Python中使用`class`定义类,通过`__init__`初始化对象。创建对象并调用方法如`drive`和`target_client`。访问权限在Python中相对宽松,使用单下划线表示受保护的属性。面向对象的三大支柱是封装、继承和多态,封装是隐藏实现细节,仅暴露简单接口。提供了数字时钟和平面上的点的类定义作为练习示例。
14 0
|
4天前
|
算法 Python
Python面向对象oop编程(二)
Python面向对象oop编程(二)
|
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深入学习面向对象编程:类和对象的定义
|
4天前
|
数据安全/隐私保护 Python
python基础之面向对象
面向对象编程(OOP)是一种以对象为中心的编程范式,通过对象和类实现现实世界的抽象。对象是程序的基本单元,类是对象的模板。主要特点包括:封装,通过访问修饰符隐藏对象内部细节,保证数据安全;继承,子类继承父类属性和方法,实现代码复用;多态,同方法调用在不同对象上产生不同行为,增强灵活性。示例代码展示了Python中的类定义、封装、继承和多态概念。