Python属性(@property)

版权声明:编写不易,转载请注明出处 https://blog.csdn.net/zha6476003/article/details/82891329

创建用于计算机的属性

在Python中,可以通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号“()”,这样可以让代码更加简洁。

通过@property创建用于计算的属性的语法如下:

class Demo:
    @property
    def methodname(self):
        block  # 方法体
  • methodname:用于指定方法名,一般使用小写字母开头。该名称最后将作为创建的属性名。
  • self:必要参数,表示类的示例。
  • block:方法体,实现的具体功能。在方法体中,通常以return语句结束,用于返回计算结果。

示例1:
定义一个矩形类,在__init__()方法中定义两个实例属性,然后在定义一个计算矩形面积的方法,并应用@property将其转换为属性,最后创建类的实例,并访问转换后的属性:

class Rect:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    @property
    def area(self):
        return self.width * self.height


rect = Rect(800, 600)
print('面积为:', rect.area)  #输出属性的值,因为使用到了装饰器这里调用area就不需要在最后加一个括号了(rect.area())

执行结果:
	面积为: 480000

注意: 通过@property转换后的属性不能重新赋值,如果对其重新赋值,将会抛出异常。

示例代码:

class Rect:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    @property
    def area(self):
        return self.width * self.height


rect = Rect(800, 600)
rect.area = 2  # <---------------在这里进行了重新赋值
print('面积为:', rect.area)  # 应为使用到了装饰器这里调用area就不需要在最后加一个括号了(rect.area)

执行结果:
	Traceback (most recent call last):
	  File "D:/xuexi/python/Demo.py", line 14, in <module>
	    rect.area = 2
	AttributeError: can't set attribute

为属性添加安全保护机制

在Python中,默认情况下,创建的类属性或者实例是可以在类外进行修改的,如果想要限制其不能在类体外修改,可以将其设置为私有的,但设置为私有后,在类体外也不能获取他的值。如果想要创建一个可以读但不能修改的属性,那么也可以使用@property实现只读属性。

示例代码:

class Demo:
    def __init__(self, one):
        self.__one = one

    @property
    def demo1(self):
        return self.__one


test = Demo(1)
test.demo1 = 2  # 直接对方法进行重新赋值
print('面积为:', test.demo1)

执行结果:
	Traceback (most recent call last):
	  File "D:/xuexi/python/Demo.py", line 11, in <module>
	    test.demo1 = 2
	AttributeError: can't set attribute

可以看到我们打算对 demo1 重新赋值但报错了,当我们使用了@property后外部就不能对我们的方法(函数)进行修改了。

总结: 使用@property后属性访问时不能对其进行修改,访问使用了@property的属性(方法/函数)不需要在后面加括号“()”。

通过@property转换后可以修改的方法:

使用 @xxx.setter方法,让属性可修改

示例代码:

class TVshow:   # 定义电视节目类
    list_film = ["战狼2", "红海行动", "西游记女儿国", "熊出没·变形记"]

    def __init__(self, show):
        self.__show = show

    @property                          # 将方法转换为属性
    def show(self):                    # 定义show()方法   # 1
        return self.__show             # 返回私有属性的值

    @show.setter    # 给show设置setter方法,让属性可修改
    def show(self, value):                               # 2
        """此函数也包含上面的这个show(# 1)的功能,如果出现重新赋值,将调用# 1 将结果返回"""
        if value in TVshow.list_film:   # 判断值是否在列表中
            self.__show = "您选择了《" + value + "》,稍后将播放"   # 返回修改的值
        else:
            self.__show = "您点播的电影不存在"


tvshow = TVshow("战狼2")   # 创建类的实例
print("正在播放:《", tvshow.show, "》")            # 获取属性值
print("您可以从", tvshow.list_film, "中选择要点播放的电影")
tvshow.show = "红海行动"    # 修改属性值
print(tvshow.show)         # 获取属性值

执行结果:
	正在播放:《 战狼2 》
	您可以从 ['战狼2', '红海行动', '西游记女儿国', '熊出没·变形记'] 中选择要点播放的电影
	您选择了《红海行动》,稍后将播放

如果直接创建实例传入参将会执行# 1这个属性,如果重新赋值就会访问到下面可修改的# 2这个属性。

猜你喜欢

转载自blog.csdn.net/zha6476003/article/details/82891329