【CS61A】CS61A——Attributes

  • ~1.80K 字
  1. 1. Attributes
    1. 1.1. Class Attributes
    2. 1.2. Attribute Lookup
      1. 1.2.1. By Name
      2. 1.2.2. By Function
    3. 1.3. Attribute Assignment
    4. 1.4. Method Calls
    5. 1.5. Bound Methods
      1. 1.5.1. Terminlology
    6. 1.6. Methods and Functions

Attributes

Class Attributes

语法:

1
2
class <name>:
<suite>
class声明将会创建一个新类并将其绑定到<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
赞助喵
非常感谢您的喜欢!
赞助喵