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属性可读、可写、也可删除,就是没有说明文档

相关文章
|
2月前
|
Java 程序员 C++
Python 面向对象详解!
本文详细介绍了Python中的面向对象编程(OOP),包括类、对象、继承、封装、多态和抽象等核心概念。通过具体示例,解释了如何使用类定义对象的属性和方法,以及如何通过继承实现代码重用。文章还探讨了封装和多态的重要性,并介绍了私有属性和抽象类的使用方法。最后,总结了OOP的四大支柱:封装、抽象、继承和多态,强调了这些概念在Python编程中的应用。适合Java程序员扩展Python编程知识。
74 2
|
4月前
|
Python
你真的会面向对象吗!解密Python“魔术方法”
你真的会面向对象吗!解密Python“魔术方法”
41 0
|
2月前
|
Python
Python面向对象(2)
【10月更文挑战第14天】
Python面向对象(2)
|
2月前
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
Python面向对象
|
2月前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
23 2
|
2月前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
24 1
|
3月前
|
前端开发 Python
Python编程的面向对象有哪些(二)
Python编程的面向对象(二)—类的多态
|
3月前
|
IDE Java 开发工具
Python类与面向对象
Python类与面向对象
|
3月前
|
存储 Java 程序员
30天拿下Python之面向对象编程
30天拿下Python之面向对象编程
18 3
|
3月前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。