Python属性和内建属性实例解析

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

后端开发标签