1. Python属性介绍
Python中的属性是类中的变量,它有两种类型:实例属性和类属性。实例属性是属于对象的,类属性是属于类的。
在Python中,我们可以通过定义普通方法来模拟Java中的getter和setter方法进行属性访问,但是,Python中提供了更加简洁明了的实现方式——属性访问器。
1.1 属性访问器
Python中,我们可以使用@property、@属性名.setter和@属性名.deleter等装饰器来实现属性的访问和设置。
其中,@property修饰的方法表示获取属性的值,@属性名.setter修饰的方法表示设置属性的值,@属性名.deleter修饰的方法表示删除属性。
class Student:
def __init__(self, name, score):
self._name = name
self._score = score
@property
def name(self):
return self._name
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
@property
def grade(self):
if self._score >= 90:
return 'A'
elif self._score >= 80:
return 'B'
elif self._score >= 70:
return 'C'
elif self._score >= 60:
return 'D'
else:
return 'E'
上面的示例代码中,通过@property方法定义了name和score两个属性的getter方法,通过@score.setter方法定义了score属性的setter方法,然后通过@property方法定义了grade属性的getter方法,实现了对属性的访问和设置。
1.2 Python内建属性
Python中内建了一些属性,我们可以在程序中直接使用它们。
1.2.1 __doc__属性
__doc__属性用于获取类、函数、方法、模块等的文档字符串。
class MyClass:
"""This is my class"""
pass
print(MyClass.__doc__)
# This is my class
1.2.2 __name__属性
__name__属性用于获取当前模块的名称,可以用于判断模块是否被当做脚本执行。
if __name__ == '__main__':
print('This module is running as a script.')
1.2.3 __module__属性
__module__属性用于获取定义当前类或函数的模块的名称。
class MyClass:
"""This is my class"""
pass
print(MyClass.__module__)
# __main__
1.2.4 __class__属性
__class__属性用于获取对象所属的类。
class MyClass:
pass
obj = MyClass()
print(obj.__class__)
# <class '__main__.MyClass'>
2. 实例分析
下面看一个案例,通过属性访问器和内建属性实现账户余额的变化。
2.1 定义类
在这个案例中,我们定义了一个叫做Account的类,用于表示账户信息。
class Account:
def __init__(self, balance):
self._balance = balance
@property
def balance(self):
return self._balance
@balance.setter
def balance(self, value):
if not isinstance(value, int):
raise ValueError('Balance must be an interger.')
self._balance = value
2.2 创建对象
接下来,我们创建一个初始余额为0的账户对象。
account = Account(0)
2.3 存取款操作
我们定义两个函数deposit和withdrawal,分别用于存款和取款,通过账户的balance属性实现对账户余额的修改。
def deposit(account, amount):
account.balance += amount
print('You deposit {} yuan in your account, now your balance is {} yuan.'.format(amount, account.balance))
def withdrawal(account, amount):
if amount > account.balance:
print('Sorry! Your account balance is not enough.')
else:
account.balance -= amount
print('You withdrawal {} yuan from your account, now your balance is {} yuan.'.format(amount, account.balance))
2.4 调用函数
最后,我们调用deposit和withdrawal函数进行存取款操作。
deposit(account, 100)
withdrawal(account, 50)
print(account.balance)
在上面的代码中,我们首先调用deposit函数向账户中存入100元,然后调用withdrawal函数从账户中取出50元,最后输出账户余额。
完整实例代码如下:
class Account:
def __init__(self, balance):
self._balance = balance
@property
def balance(self):
return self._balance
@balance.setter
def balance(self, value):
if not isinstance(value, int):
raise ValueError('Balance must be an interger.')
self._balance = value
def deposit(account, amount):
account.balance += amount
print('You deposit {} yuan in your account, now your balance is {} yuan.'.format(amount, account.balance))
def withdrawal(account, amount):
if amount > account.balance:
print('Sorry! Your account balance is not enough.')
else:
account.balance -= amount
print('You withdrawal {} yuan from your account, now your balance is {} yuan.'.format(amount, account.balance))
account = Account(0)
deposit(account, 100)
withdrawal(account, 50)
print(account.balance)
执行结果为:
You deposit 100 yuan in your account, now your balance is 100 yuan.
You withdrawal 50 yuan from your account, now your balance is 50 yuan.
50