Python self 关键字详解
基本概念
self 是类方法的第一个参数,代表当前实例对象本身。
class User:
def __init__(self, username):
self.username = username # self 指向 User 实例
def say_hello(self):
print(f"Hello, {self.username}") # 访问实例属性
什么时候需要 self?
1. 访问实例属性
class User:
def __init__(self, username):
self.username = username # 赋值给实例的属性
def get_username(self):
return self.username # 读取实例的属性
2. 调用实例方法
class User:
def greet(self):
print("Hi!")
def introduce(self):
self.greet() # 调用同一实例的其他方法
例子:User 模型中的 self
User 模型
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True)
username: Mapped[str] = mapped_column(String(50), nullable=False)
def __init__(self, username: str):
self.username = username
def say_hi(self):
print(f"我是 {self.username}")
def __str__(self):
return f"User({self.username})" # 用 self 访问属性
使用
# 创建 User 实例
user = User("zzyzzye")
# 用 self 访问属性
print(user.username) # "zzyzzye"
# 调用实例方法
user.say_hi() # "我是 zzyzzye"
# 字符串表示
print(user) # "User(zzyzzye)"
方法对比:普通方法 vs 静态方法 vs 类方法
1. 实例方法(需要 self)
class User:
def __init__(self, username):
self.username = username
def say_hello(self): # 需要 self
print(f"Hello, {self.username}")
2. 静态方法(不需要 self)
class User:
@staticmethod
def format_username(username: str) -> str: # 不需要 self
return username.strip().lower()
# 调用方式
User.format_username(" Zzyzzye ") # "zzyzzye"
3. 类方法(不需要 self,但需要 cls)
class User:
def __init__(self, username):
self.username = username
@classmethod
def create_default(cls): # 需要 cls,不需要 self
return cls(username="默认用户")
@classmethod
def from_dict(cls, data: dict):
return cls(username=data["username"])
# 调用方式
user1 = User.create_default() # 使用类方法创建实例
user2 = User.from_dict({"username": "test"}) # 从字典创建
类方法和静态方法的区别
类方法
class User:
count = 0 # 类变量
def __init__(self):
User.count += 1 # 用 cls 访问类变量
@classmethod
def get_count(cls):
return cls.count # 用 cls 访问类变量
# 调用
User.get_count() # 返回 0
user = User()
User.get_count() # 返回 1
静态方法
class User:
@staticmethod
def is_valid_username(username: str) -> bool:
return len(username) >= 3 # 纯逻辑判断,不需要访问类或实例
# 调用
User.is_valid_username("ab") # False
User.is_valid_username("abc") # True
常见误区
错误:忘记 self
class User:
def greet(self):
username = self.username # 正确
def say_hello(): # 错误:少写 self
print(username) # NameError: name 'username' is not defined
错误:把 self 当参数传给方法
user = User("test")
user.greet(user) # 错误:self 是自动传入的,不需要手动传
错误:在类方法中使用 self
class User:
@classmethod
def create(cls, username): # cls 代表类
return cls(username=username)
@staticmethod
def format(username): # 静态方法没有 self
return username
实际应用:CRUD 操作
class UserCRUD:
def create_user(self, username: str, password: str):
# self 代表 UserCRUD 实例
user = User(username=username)
user.hashed_password = password
return user
def update_user(self, user: User, nickname: str):
# self 代表 UserCRUD 实例
user.nickname = nickname
return user
# 使用
crud = UserCRUD()
user = crud.create_user("zzyzzye", "password")
updated_user = crud.update_user(user, "昵称")
总结
| 类型 | 参数 | 用途 |
|---|---|---|
| 实例方法 | self | 访问实例属性和方法 |
| 类方法 | cls | 访问类变量,创建实例 |
| 静态方法 | 无 | 纯逻辑,不需要访问类或实例 |
记住:
- 实例方法必须有
self - 静态方法不需要
self(用@staticmethod装饰) - 类方法用
cls(用@classmethod装饰) - 调用实例方法时,
self自动传入,不用手动传
评论区