398 字
1 分钟
python中的方法
python里的静态方法与类方法
python里的方法分为实例方法,类方法和静态方法。
什么是方法?
这个问题嘛😯首先大佬们知道有“函数”这个东西吧?他和方法的区别就是位置不同,参数不同。
打个比方就是
函数:可以定义在全局任何地方,跟个流浪汉一样没有家😭方法:依附于实例,定义的类就是他的家。并且他的第一个参数必须是self或者cls实例方法
好啦,了解了什么是方法之后,我们来看一下实例方法。
定义:不需要装饰器。 第一个参数:self (代表具体的那个对象)。 特点:必须通过 对象 调用 (obj.method())。 能干嘛:既能改对象自己的属性,也能改类的属性
class Fatdog: def __init__(self,weight): self.weight=weight#这是实例属性 def poop(self):#这是示例方法 print(f"今天腹泻,拉了和体重一样的💩,大概{self.weight}")dog1 = Fatdog()dog1.poop()#调用实例方法等价于: Fatdog.poop(dog1) -> 自动把 r 传给 self,这是python帮我们实现的,很智能吧!类方法
定义:加 @classmethod。 第一个参数:cls (代表类本身,比如 Robot)。 特点:可以通过 类 调用 (Robot.method()),也可以通过对象调用。 能干嘛:不能访问实例属性(因为没有 self),但能访问和修改类属性。 最强场景:替代构造函数(Factory Pattern)。
为什么不用 init 直接搞? 因为有时候你需要不同的创建方式(比如从数据库加载、从配置文件加载、从 JSON 解析),但 init 只能有一个。这时候就用 @classmethod 提供多种“构造入口”。
class Egg: company="Bigegg"#这个和count都是类属性 count = 0
def __init__(self,name): self.name = name Egg.count+=1
@classmethod def create_with_prefix(cls,prefix,name): # cls 就是 EGG 类 # 这里可以统一修改类属性,或者根据逻辑返回不同的子类实例 full_name = f"{prefix}_{name}" print(f"🏭 工厂正在生产: {full_name}") return cls(full_name) # 相当于调用 Egg(full_name)
@classmethod def change_commpany(cls,new_name): cls.company=new_name #修改类属性
e1=Egg.create_with_prefix("aw","bbq")#不用先new对象,直接调用类方法e2=Egg.create_with_prefix("ddd","aas")Egg.change_commpany("Fatdog")# 一键修改所有实例的 companyprint(e1.company)静态方法
我的理解就是他没地方放了(很像普通函数),为了美观塞进了类里面🤪
在类里面加装饰器@staticmethod即可定义
class Robot: company = "FutureBot"
def __init__(self, name): self.name = name
@staticmethod def add_two_numbers(a, b): # ❌ 这里不能用 self.name # ❌ 这里不能用 Robot.company # 它就是个纯函数! return a + b
@staticmethod def is_valid_name(name): # 做个简单的校验逻辑,跟具体哪个机器人无关 return len(name) > 3
# 用法print(Robot.add_two_numbers(1, 2)) # 输出: 3print(Robot.is_valid_name("Bob")) # 输出: False
r = Robot("Alice")print(r.add_two_numbers(5, 5)) # 也能通过对象调,但没啥意义部分信息可能已经过时









