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
相关文章
|
3月前
|
Java 程序员 C++
Python 面向对象详解!
本文详细介绍了Python中的面向对象编程(OOP),包括类、对象、继承、封装、多态和抽象等核心概念。通过具体示例,解释了如何使用类定义对象的属性和方法,以及如何通过继承实现代码重用。文章还探讨了封装和多态的重要性,并介绍了私有属性和抽象类的使用方法。最后,总结了OOP的四大支柱:封装、抽象、继承和多态,强调了这些概念在Python编程中的应用。适合Java程序员扩展Python编程知识。
91 2
|
1月前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
5月前
|
Python
你真的会面向对象吗!解密Python“魔术方法”
你真的会面向对象吗!解密Python“魔术方法”
58 0
|
3月前
|
Python
Python面向对象(2)
【10月更文挑战第14天】
Python面向对象(2)
|
3月前
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
Python面向对象
|
3月前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
44 2
|
3月前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
39 1
|
4月前
|
前端开发 Python
Python编程的面向对象有哪些(二)
Python编程的面向对象(二)—类的多态
32 7
|
4月前
|
IDE Java 开发工具
Python类与面向对象
Python类与面向对象
|
4月前
|
存储 Java 程序员
30天拿下Python之面向对象编程
30天拿下Python之面向对象编程
26 3