20201201_100.@property装饰器_get和set方法

首页 » Python » 正文

@property 装饰器

@property 可以将一个方法的调用方式变成“属性调用”,一般用来给属性增加getter和setter方法。
【案例1】@property使用简单示例
例1.1

class Employee:

    @property  # 使用了@property装饰器
    def salary(self):
        print('Salary is running...')
        return 10000


e1 = Employee()
e1.salary()  # 会报错

运行结果:
20201201_100.@property装饰器_get和set方法

例1.2

class Employee:

    @property  # 使用了@property装饰器
    def salary(self):
        print('Salary is running...')
        return 10000


e1 = Employee()
e1.salary  # 可以通过变量的用法来使用

运行结果:
20201201_100.@property装饰器_get和set方法

例1.3

class Employee:

    @property  # 使用了@property装饰器
    def salary(self):
        print('Salary is running...')
        return 10000


e1 = Employee()
e1.salary
e1.salary = 20000  # 但不支持修改

运行结果:
20201201_100.@property装饰器_get和set方法

【案例2】@property小实践
例2.1

class Employee:

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary


e1 = Employee('李四', 12000)
print(e1.salary)
e1.salary = -16000
print(e1.salary)

运行结果:
20201201_100.@property装饰器_get和set方法
说明:
这里展示了一个记录薪水的小程序,但这里出现的问题是:如果用户误输入-16000这样的数,程序也会正常执行下去产生错误的结果。
设计程序不能想着用户总会按照规范的操作方式来操作,而应该让程序尽可能的简单易用,所以作为程序员需要事先将后台的细节、用户可能出现的误操作都考虑到并且预先做好优化。
这个案例中,下一步我们将通过私有属性和逻辑判断将用户误输入负数这个问题解决。

例2.2

class Employee:
    """通过私有属性和逻辑来解决用户输入错误的问题。"""
    def __init__(self, name, salary):
        self.__name = name
        self.__salary = salary

    def get_salary(self):
        return self.__salary

    def set_salary(self, salary):
        if 1000 < salary < 50000:
            self.__salary = salary
        else:
            print('输入错误,薪水值范围:1000-50000。')


e1 = Employee('李四', 12000)
print(e1.get_salary())
e1.set_salary(-16000)
print(e1.get_salary())
e1.set_salary(16000)
print(e1.get_salary())

运行结果:
20201201_100.@property装饰器_get和set方法

例2.3 通过@property来解决例2.1中出现的问题

class Employee:

    def __init__(self, name, salary):
        self.__name = name
        self.__salary = salary

    @property
    def salary(self):
        return self.__salary

    @salary.setter  # 针对属性(方法)salary(由@property转为的属性)的设置。
    def salary(self, salary):
        if 1000 < salary < 50000:
            self.__salary = salary
        else:
            print('输入错误,薪水值范围:1000-50000。')


e1 = Employee('张三', 18000)
print(e1.salary)
e1.salary = -20000  # 因为有了@salary.setter的设置,所以这里可以用这样的方式赋值了。
print(e1.salary)
e1.salary = 20000  # 使用@salary.setter的设置,使用户修改薪水数值比例2.2中的操作更简单
print(e1.salary)

运行结果:
20201201_100.@property装饰器_get和set方法

属性和方法命名总结

· _xxx:保护成员,不能用“from module import * ”导入,只有类对象和子类对象能访问这些成员。
· xxx:系统定义的特殊成员
· __xxx: 类中的私有成员,只有类对象自己能访问,子类对象也不能访问。(但,在类外部可以通过“对象名. _类名__xxx”这种特殊方式访问。Python 不存在严格意义的私有成员)
注:再次强调,方法和属性都遵循上面的规则。

类编码风格

  1. 类名首字母大写,多个单词之间采用驼峰原则。
  2. 实例名、模块名采用小写,多个单词之间采用下划线隔开。
  3. 每个类,应紧跟“文档字符串”,说明这个类的作用。
  4. 可以用空行组织代码,但不能滥用。在类中,使用一个空行隔开方法;模块中,使用两个空行隔开多个类。

实操作业

  1. 如下代码,使用图文分析整个内存过程:
class Student:
    school = "NK"  # 类属性
    count = 0  # 类属性

    def __init__(self, name, score):
        self.name = name  # 实例属性
        self.score = score
        Student.count += 1

    def say_score(self):  # 实例方法
        print("我的学校是:{}".format(Student.school))
        print('{}的分数是:{}'.format(self.name, self.score))


s1 = Student('张三', 88)

答:
20201201_100.@property装饰器_get和set方法

  1. 设计一个名为 MyRectangle 的矩形类来表示矩形。这个类包含:
    (1) 左上角顶点的坐标:x,y
    (2) 宽度和高度:width、height
    (3) 构造方法:传入 x,y,width,height。如果(x,y)不传则默认是 0,如果 width 和 height 不传,则默认是 100.
    (4) 定义一个 getArea() 计算面积的方法
    (5) 定义一个 getPerimeter(),计算周长的方法
    (6) 定义一个 draw()方法,使用海龟绘图绘制出这个矩形

答:

class MyRectangle:
    """矩形类"""

    def __init__(self, x=0, y=0, width=100, height=100):
        """
        (1) 左上角顶点的坐标:x,y
        (2) 宽度和高度:width、height
        (3) 构造方法:传入 x,y,width,height。如果(x,y)不传则默认是 0,如果 width 和 height 不传,则默认是 100.
        """
        self.x = x
        self.y = y
        if width > 0 and height > 0:
            self.width = width
            self.height = height
        else:
            print('输入错误,width、height均应 > 0。')

    def getArea(self):
        """getArea(),计算面积的方法"""
        return self.width * self.height

    def getPerimeter(self):
        """getPerimeter(),计算周长的方法"""
        return (self.width + self.height) * 2

    def draw(self):
        """draw()方法,使用海龟绘图绘制出这个矩形"""
        import turtle
        turtle.penup()
        turtle.goto(self.x, self.y)
        turtle.pendown()
        turtle.goto(self.x + self.width, self.y)
        turtle.goto(self.x + self.width, self.y + self.height)
        turtle.goto(self.x, self.y + self.height)
        turtle.goto(self.x, self.y)
        turtle.hideturtle()  # 隐藏画笔。
        turtle.done()  # 画完之后不自动关闭绘图窗口。


r1 = MyRectangle(10, 20, 200, 400)
print(r1.getArea())
print(r1.getPerimeter())
r1.draw()

未经允许不得转载:作者:1324-易同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《20201201_100.@property装饰器_get和set方法》 发布于2020-12-03

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录