100:@property装饰器_get和set方法

###@property 装饰器

@property 可以将一个方法的调用方式变成“属性调用”。下面是一个简单的示例,让大家体会一下这种转变:

# 简单测试@property
class Employee:

    @property
    def salary(self):
        return 30000


emp1 = Employee()
print(emp1.salary)  # 打印 30000
print(type(emp1.salary))  # 打印<class 'int'>#emp1.salary() #报错:TypeError: 'int' object is not callable

# emp1.salary =1000 #@property 修饰的属性,如果没有加 setter 方法,则为只读属性。此处修改报错:AttributeError: can't set attribute

输出结果:

D:\work\python\three\venv\Scripts\python.exe D:\work\python\three\mypy12.py 
30000
<class 'int'>

@property 主要用于帮助我们处理属性的读操作、写操作。对于某一个属性,我们可以直接通过:
     emp1.salary = 30000
如上的操作读操作、写操作。但是,这种做法不安全。比如,我需要限制薪水必须为 1-10000的数字。这时候,我们就需要通过 getter、setter 方法来处理。

# 测试@property
class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.__salary = salary

    @property  # 相当于 salary 属性的 getter 方法
    def salary(self):
        print("月薪为{0},年薪为{1}".format(self.__salary, (12 * self.__salary)))
        return self.__salary

    @salary.setter
    def salary(self, salary):  # 相当于 salary 属性的 setter 方法
        if 0 < salary < 1000000:
            self.__salary = salary
        else:
            print("薪水录入错误!只能在 0-1000000 之间")


emp1 = Employee("高淇", 100)
print(emp1.salary)

emp1.salary = -200

输出结果:

D:\work\python\three\venv\Scripts\python.exe D:\work\python\three\mypy13.py 
月薪为100,年薪为1200
100
薪水录入错误!只能在 0-1000000 之间

###属性和方法命名总结

_xxx:保护成员,不能用“from module import * ”导入,只有类对象和子类对象能访问这些成员。
__xxx__:系统定义的特殊成员
__xxx: 类中的私有成员,只有类对象自己能访问,子类对象也不能访问。(但,在类外部可以通过“对象名. _类名__xxx”这种特殊方式访问。Python 不存在严格意义的私有成员)

注:再次强调,方法和属性都遵循上面的规则。

###类编码风格

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

posted @ 2022-11-19 16:49  竹蜻蜓vYv  阅读(39)  评论(0编辑  收藏  举报