目 录CONTENT

文章目录

Python-self关键字

~梓
2026-04-11 / 0 评论 / 0 点赞 / 1 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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 自动传入,不用手动传
0

评论区