Attributes
Class Attributes
语法: 1
2class <name>:
<suite><name>上,作为当前环境的第一个作用域
类语句内部,赋值语句和def语句创建类属性,此时它们作为类属性放入类中,而非在作用域中
当class声明执行时,内部语句才会执行
类属性在类的所有实例之间共享 这样我们不必在每个创建的实例中存储此值,而只需要在类中存储一次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Account:
interest = 0.02 # 类属性
def __init__(self, account_holder):
self.balance = 0
self.holder = account_holder
def deposit(self, amount):
self.balance = self.balance + amount
return self.balance
tom = Account('Tom')
jim = Account('Jim')
print(tom.interest)
print(jim.interest)0.02
0.02
Attribute Lookup
By Name
表达式提供对象,名称提供要查找的属性名称
但通过name查找将会查找多个位置,这取决于点表达式: -
首先执行点左侧表达式,生成该对象 -
<name>与该对象的实例属性匹配,如果存在该名称的属性,则返回值
- 如果没有找到,则在该对象的类中查找(类属性) -
返回的值是整个表达式的值,除非是一个函数,函数将会返回一个绑定的方法,对象填充为self
By Function
使用getatter函数,可以用属性名的字符串来查找对应属性
使用hasatter函数,可以判断是否具有该属性
getatter函数与点表达式查询方式相同
在对象中查询属性可能会返回实例属性或类属性之一
Attribute Assignment
左侧有点表达式的赋值语句会影响点表达式对应对象的属性 - 如果对象是一个实例,则赋值将设置一个实例属性 - 如果对象是一个类,则赋值将设置一个类属性
1
2
tom.interest = 0.08
Account.interest = 0.04第一个语句将会在tom实例中寻找interest属性,没有找到,则在其中添加该属性 第二个语句将会在Account类中寻找interest属性,找到后将值修改为对应值
Method Calls
方法可使用点表达式调用 其中表达式可以是任何有效的python表达式
表达式的值是通过该表达式值对象中查找<name>而计算的属性值
1
tom.deposit(10)Bound Methods
Terminlology
- 所有对象都有属性,均为name-value二元组
- 类是对象的一种, 故类也有属性
- 实例属性:一个实例的属性
- 类属性:类本身的属性,但仍可以从实例访问
- python中函数也是对象
- 绑定方法也是对象,即第一个参数为self的函数,该参数已经绑定到了一个实例
- 点表达式执行那些类属性是函数的绑定方法
Methods and Functions
python区分方法与函数 - 函数是从一开始就定义的 - 绑定方法在方法被调用时将一个函数和其对象绑定起来, 即Object+Function = Bound Method
1
2
print(type(Account.deposit))
print(type(tom.deposit))<class 'function'>
<class 'method'>
此时我们有两种方法调用 1. 作为函数调用,此时需要传递self和amount两个参数 2. 作为绑定方法调用,此时只需要传递amount参数
1
2
Account.deposit(tom, 1001)
tom.deposit(1007)2008