13.类属性、实例属性、静态方法、类方法、实例方法
大约 5 分钟学习笔记Python基础
1. 静态方法、类方法、实例方法
三种方法的区别:
方法类型 | 标记 | 调用方法 | 传参 | 作用 |
---|---|---|---|---|
实例方法 | 无 | 对象.方法名() | self | 可以访问实例属性,类属性 |
类方法 | @classmethod | 类名.方法名() | cls | 可以访问类属性,不能访问实例属性 |
静态方法 | @staticmethod | 类名.方法名() | 无 | 不能访问类属性,实例属性 |
1.1 实例方法
实例方法是最常用的方法,它的第一个参数是
self
,表示实例对象本身。 通过实例对象调用实例方法时,Python 会自动将实例对象传递给self
参数。
- 定义 : 通过将类的实例作为method的第一个参数来定义方法。
- 调用 : 通过实例对象调用方法。如
obj.method(arg1, arg2)
。 - 应用场景 : 当需要访问或修改对象的内部状态时,使用实例方法。
class test:
math = 100
def __init__(self): # 类构造方法也是实例方法
self.Chinese = 90
self.English = 80
def say(self): # 实例方法
print('我的语文成绩是:{}'.format(self.Chinese))
# 实例化
A = test()
# 调用实例方法
A.say() # 我的语文成绩是:90
print(A.say) # <bound method test.say of <__main__.test object at 0x104990cd0>>
若想直接调用方法,需要手动为 self 传入实例,如下:
A = test() # 实例化
# 为self传入实例
test.say(A) # 我的语文成绩是:90
1.2 静态方法
静态方法与类和实例无关, 它不需要访问任何类或实例属性.
- 定义 : 使用
@staticmethod
装饰器来定义静态方法。 - 调用 : 通过类名或实例对象调用静态方法。如
Class.method(arg1, arg2)
或obj.method(arg1, arg2)
。 - 应用场景 : 当需要执行与类和实例无关的操作时,使用静态方法。
class test:
math = 100
def __init__(self): # 类构造方法也是实例方法
self.Chinese = 90
self.English = 80
@staticmethod
def say():
print('我的语文成绩是:90')
# 类.方法名
test.say() # 我的语文成绩是:90
print(test.say) # <function test.say at 0x1029f4b80>
# 实例化
A=test()
A.say() # 我的语文成绩是:90
print(A.say) # <function test.say at 0x1029f4b80>
1.3 类方法
类方法可以通过类名或实例来调用, 并可以访问或修改类的属性
- 定义 : 使用
@classmethod
装饰器来定义类方法, 第一个参数是cls
。 - 调用 : 通过类名或实例对象调用类方法。如
Class.method(arg1, arg2)
或obj.method(arg1, arg2)
。 - 应用场景 : 当需要访问或修改类属性时,使用类方法。
class test:
math = 100
def __init__(self): # 类构造方法也是实例方法
self.Chinese = 90
self.English = 80
@classmethod
def say(cls):
print('我的数学成绩是:{}'.format(cls.math))
# 类.方法名
test.say() # 我的数学成绩是:100
print(test.say) # <bound method test.say of <class '__main__.test'>>
# 实例化调用
test().say() # 我的数学成绩是:100
print(test().say) # <bound method test.say of <class '__main__.test'>>
1.4 综合案例
class Test:
name = 'test'
age = 18
def __init__(self):
self.name = 'init_test'
self.age = 20
@staticmethod
def static_method():
# print(f'name: {name}, age: {age}') # 报错, 静态方法不能直接调用类属性
print(f'name: {Test.name}, age: {Test.age}') # name: test, age: 18
@classmethod
def class_method(cls):
print(f'name: {cls.name}, age: {cls.age}') # name: test, age: 18
print(f'name: {Test.name}, age: {Test.age}') # name: test, age: 18
def instance_method(self):
print(f'name: {self.name}, age: {self.age}') # name: init_test, age: 20
print(f'name: {Test.name}, age: {Test.age}') # name: test, age: 18
if __name__ == '__main__':
# 实例调用
t = Test()
t.static_method()
t.class_method()
t.instance_method()
print("=="*20)
# 类直接调用
Test.static_method()
Test.class_method()
# Test.instance_method() # 报错, 实例方法不能直接调用
2. 类属性、实例属性
类属性 : 类对象的属性,它被所有实例对象所共有,可以通过类对象和实例对象访问。
实例属性 : 实例对象的属性,只能通过实例对象访问, 独属于当前实例的属性。
2.1 类属性
- 存储常量和配置信息 :可以使用类属性来存储与类相关的常量值或默认配置信息。
- 例如,存储数学常数、API密钥或默认设置。
- 共享状态信息 :如果需要在所有类的实例之间共享某种状态信息,类属性是一个合适的选择。
- 例如,可以使用类属性来记录创建的实例数量。
class Dog:
# 类属性
species = "犬科动物"
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age # 实例属性
# 创建两个实例
buddy = Dog("大黄", 9)
miles = Dog("小白", 4)
# 访问实例属性
print(f"{buddy.name} {buddy.age} 岁了.") # 大黄 9 岁了.
print(f"{miles.name} {miles.age} 岁了.") # 小白 4 岁了.
# 访问类属性
print(f"{buddy.name} 是 {buddy.species}.") # 大黄 是 犬科动物.
print(f"{miles.name} 也是 {miles.species}.") # 小白 也是 犬科动物.
2.2 修改类属性
class MyClass:
class_attr = 42 # 类属性
# 修改类属性的值
MyClass.class_attr = 100
# 创建类的实例
obj = MyClass()
# 访问类属性
print(obj.class_attr) # 输出:100
2.3 实例属性
- 存储对象的状态 :实例属性通常用于存储对象的状态信息。
- 例如,如果创建一个代表用户的类,那么每个用户对象可以有自己的用户名、电子邮件地址等属性。
- 存储对象特定的数据 :每个实例可以拥有自己独立的数据。
- 例如,如果创建一个代表图书的类,每本书可以有自己的标题、作者和出版日期。
class Car:
def __init__(self, make, model, year):
self.make = make # 实例属性
self.model = model # 实例属性
self.year = year # 实例属性
def display_info(self):
return f"{self.year} {self.make} {self.model}"
# 创建两个Car实例
car1 = Car("丰田", "凯美瑞", 2022)
car2 = Car("本田", "思域", 2021)
# 访问实例属性和调用方法
print(car1.display_info()) # 输出:2022 丰田 凯美瑞
print(car2.display_info()) # 输出:2021 本田 思域
2.4 修改实例属性
class Person:
def __init__(self, name):
self.name = name # 实例属性
# 创建一个实例
person = Person("Alice")
# 修改实例属性的值
person.name = "Bob"
# 访问实例属性
print(person.name) # 输出:Bob