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

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

@property


  • 是一个装饰器,相当于 getter 装饰器
  • 可以使用 @property 来创建只读属性,将一个实例方法变成一个相同名称的只读实例属性,这样可以防止属性被修改

 

代码栗子

# @property
class PoloBlog:
    def __init__(self, name):
        self.__name = name
    @property
    def name(self):
        return self.__name
blog = PoloBlog("小菠萝")
print(blog.name)
blog.name = "test"
# 输出结果
小菠萝
    blog.name = "test"
AttributeError: can't set attribute


name 是一个只读属性,不可写,相当于 __name 私有属性只有 getter 方法,没有 setter 方法

 

等价写法

class PoloBlog:
    def __init__(self, name):
        self.__name = name
    def getName(self):
        return self.__name
    name = property(getName)
blog = PoloBlog("小菠萝")
print(blog.name)


那想给 __name 设置值怎么办呢?

 

setter 装饰器


语法格式

@方法名.setter

def 方法名(self, value):

   self.__value = value

    ...

 

代码栗子

# @setter
class PoloBlog:
    def __init__(self, name):
        self.__name = name
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, name):
        self.__name = name
blog = PoloBlog("小菠萝")
# 打印属性值
print(blog.name)
# 修改属性
blog.name = "新的小菠萝"
print(blog.name)
# 输出结果
小菠萝
新的小菠萝


deleter 装饰器


和 setter 装饰器差不多写法

 

语法格式

@方法名.deleter

def 方法名(self):

    ...

 

代码栗子

class PoloBlog:
    def __init__(self, name):
        self.__name = name
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, name):
        self.__name = name
    @name.deleter
    def name(self):
        print("删除 __name")
blog = PoloBlog("小菠萝")
# 打印属性值
print(blog.name)
# 修改属性
blog.name = "新的小菠萝"
# 删除属性
del blog.name
# 输出结果
小菠萝
删除 __name


@property 踩坑


加了 @property 的方法相当于一个实例属性,所以不能和其他实例属性重名

 

错误代码栗子

class A:
    def __init__(self):
        # 已经定义了 name 实例属性
        self.name = 2
    # 这里相当于也定义了一个 name 实例属性
    @property
    def name(self):
        return self.name
    @name.setter
    def name(self, name):
        self.name = name
a = A()
print(a.name)
# 输出结果
Traceback (most recent call last):
  File "/Users/polo/Documents/pylearn/第四章:面向对象/17_实战5.py", line 26, in <module>
    a = A()
  File "/Users/polo/Documents/pylearn/第四章:面向对象/17_实战5.py", line 14, in __init__
    self.name = 2
  File "/Users/polo/Documents/pylearn/第四章:面向对象/17_实战5.py", line 23, in name
    self.name = name
  File "/Users/polo/Documents/pylearn/第四章:面向对象/17_实战5.py", line 23, in name
    self.name = name
  File "/Users/polo/Documents/pylearn/第四章:面向对象/17_实战5.py", line 23, in name
    self.name = name
  [Previous line repeated 994 more times]
RecursionError: maximum recursion depth exceeded


报错翻译:递归错误 超过最大递归深度

其实就是因为命名冲突导致了死循环

改下命名就好了

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