红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61A】CS61A——Attributes

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