对象和类

由对象说起

对象与对象名称之间的区别

把变量理解为附加在对象上的标注。创建对象之后才会把变量分配给对象

例:变量 a 和 b 引用同一个列表,而不是那个列表的副本

1
2
3
4
a = [1, 2, 3]
b = a
b.append(4)
b
image-20250514154637571

类与实例

在Python中通常使用class语句来定义一个类(类对象)

class定义的对象(类)可以用于产生新的对象(实例)。

1
2
3
4
5
class Person():
pass

someone = Person()
print(id(someone), type(someone))

上面的例子中Person是我们创建的一个新的类,
通过调用Person()可以获得一个Person类型的实例对象,
将其赋值为someone
就成功创建了一个与所有内置对象类型不同的对象someone
它的类型为__main__.Person
到这里,可以将Python中一切的对象分为两种:

  1. 可以用来生成新对象的类,包括内置的intstr以及上面定义的Person等;

  2. 由类生成的实例对象,包括内置类型的数字、字符串、以及上面定义的类型为__main__.Personsomeone

类中的属性对应前面所学习的变量,而类中的方法对应前面所学习的函数。
通过类,可以把数据和操作封装在一起,从而使得程序结构更加清晰,
这也就是所谓的类的封装性。

在类的内部,使用def关键字可以为类定义一个方法,
与一般函数定义不同,方法必须包含参数self,且为第一个参数。

1
2
3
4
5
6
7
8
9
class Person():
name = 'TZ'
sex = 'F'
def jump(self):
print('Jumping!')
tz = Person()
tz.jump()
tz.name
tz.sex

特殊的对象初始化方法__init__

1
2
3
4
5
6
7
8
# 初始化一个 Person 类的 name 属性
class Person():
def __init__(self, name):
self.name = name

someone = Person('小明')
print(someone)
print(someone.name) # 访问类属性

上面代码执行流程:

  1. 查看Person类的定义;
  2. 在内存中实例化(创建)一个新的对象;
  3. 调用对象的__init__方法,将这个新创建的对象作为self参数传入,并将另一个参数(‘小明’)作为name传入;
  4. name的值存入对象;
  5. 返回这个新的对象;
  6. 将名字someone与这个对象关联。

提示:每次创建对象时,系统都会在内存中选择一块区域分配给对象,每次选择的内存通常是不一样的。因此,实际运行时会看到一个不同的 Person 对象地址。

1
2
3
4
5
6
7
8
9
10
11
12
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
return self.name
def set_name(self, name):
self.name = name
def get_age(self):
return self.age
def set_age(self, age):
self.age = age

注意:在类的内部,使用def关键字可以为类定义一个方法,
当调用一个特定对象的方法时,Python 隐式地传递对该
对象的引用作为方法的第一个参数。 因此,在一个类中,所有方法必须包含参数self,且为第一个参数。
类中的方法只能使用该引用(self)来访问对象的属性和其他方法。

总结:

  1. 对象既包含数据(称为特性/属性),也包含代码(称为方法)
  2. 类是对象的模板,从类制作对象的过程,称为类的实例化
  3. 在类的内部,方法定义时必须包含参数self,且为第一个参数
  4. __init__是初始化方法,当创建了实例时会调用该方法
  5. 类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线,
    实例名和模块名都采用小写格式,并在单词之间加上下划线

实例

创建一个名为 BankAccount 的类, 要求:

  • 属性: balance(表示账户余额)
  • 方法: deposit(amount),用于存款,返回账户余额。
    withdraw(amount),用于取款,返回账户余额,若余额不足则返回“余额不足”信息。
    get_balance(),用于返回当前余额。

创建实例,并调用上述方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class BankAccount:
def __init__(self):
self.balance = 0 # 初始化账户余额为0

def deposit(self, amount):
if amount > 0:
self.balance += amount
return self.balance
else:
print("存款金额必须大于0")
return self.balance

def withdraw(self, amount):
if amount > 0:
if self.balance >= amount:
self.balance -= amount
return self.balance
else:
return "余额不足"
else:
print("取款金额必须大于0")
return self.balance

def get_balance(self):
return self.balance

# 创建BankAccount类的实例
account = BankAccount()

# 调用存款方法
print(account.deposit(1000))

# 调用取款方法
print(account.withdraw(300))

# 调用获取余额方法
print(account.get_balance())