###@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. 可以用空行组织代码,但不能滥用。在类中,使用一个空行隔开方法;模块中,使用两个空行隔开多个类。