Python面向对象实例方法与类方法staticmethod三兄弟一、开篇类中的三种方法在一个Python类中你可以定义三种方法实例方法操作实例数据、类方法操作类数据、静态方法独立工具函数。它们通过不同的装饰器区分各自有不同的第0个参数。⌨️ 三兄弟一目了然classDemo:展示三种方法# 实例方法——第一个参数是self实例definstance_method(self):returnf我是实例方法self{self}# 类方法——第一个参数是cls类本身classmethoddefclass_method(cls):returnf我是类方法cls{cls.__name__}# 静态方法——没有特殊的第一个参数staticmethoddefstatic_method():return我是静态方法没有特殊参数dDemo()print(d.instance_method())# 通过实例调用print(Demo.class_method())# 通过类调用推荐print(Demo.static_method())# 通过类调用推荐二、三种方法详解2.1 实例方法classBankAccount:银行账户——实例方法操作实例数据bank_name第一银行# 类属性def__init__(self,owner,balance0):self.ownerowner# 实例属性self.balancebalance# 实例属性self.transactions[]# 实例属性# 这些是实例方法——它们需要访问或修改实例的数据defdeposit(self,amount):存款——需要修改self.balanceself.balanceamount self.transactions.append(f{amount})returnself.balancedefwithdraw(self,amount):取款——需要访问self.balanceifamountself.balance:raiseValueError(余额不足)self.balance-amount self.transactions.append(f-{amount})returnself.balancedefget_statement(self):获取对账单——需要self的所有数据return(f账户持有人:{self.owner}\nf余额: ¥{self.balance}\nf交易记录:{, .join(self.transactions)})# 实例方法的使用场景# - 需要读写self.xxx实例属性# - 这是最常见的方法类型2.2 类方法classUser:用户类——类方法提供替代构造器_total_users0def__init__(self,username,email,roleuser):self.usernameusername self.emailemail self.rolerole User._total_users1# 类方法——第一个参数是cls类本身classmethoddefcreate_admin(cls,username,email):创建管理员——替代构造器returncls(username,email,roleadmin)classmethoddeffrom_dict(cls,data):从字典创建用户——另一个替代构造器returncls(data[username],data[email],data.get(role,user))classmethoddeffrom_csv(cls,csv_line):从CSV行创建用户partscsv_line.strip().split(,)returncls(parts[0],parts[1],parts[2]iflen(parts)2elseuser)classmethoddefget_total_users(cls):获取用户总数——访问类属性returncls._total_users# 使用类方法——多种创建方式adminUser.create_admin(admin1,admintest.com)user1User.from_dict({username:zhangsan,email:zstest.com})user2User.from_csv(lisi,lisitest.com,vip)print(admin.role)# adminprint(user1.username)# zhangsanprint(user2.role)# vipprint(User.get_total_users())# 3# 类方法的使用场景# - 替代构造器提供多种创建实例的方式# - 访问/修改类属性# - 工厂方法模式2.3 静态方法importreclassValidator:验证器——静态方法组织工具函数staticmethoddefis_valid_email(email):验证邮箱格式patternr^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$returnbool(re.match(pattern,email))staticmethoddefis_valid_phone(phone):验证手机号patternr^1[3-9]\d{9}$returnbool(re.match(pattern,phone))staticmethoddefis_strong_password(password):验证密码强度return(len(password)8andany(c.isalpha()forcinpassword)andany(c.isdigit()forcinpassword))staticmethoddefclamp(value,min_val,max_val):数值范围限制returnmax(min_val,min(value,max_val))# 使用静态方法——不需要创建实例print(Validator.is_valid_email(testexample.com))# Trueprint(Validator.clamp(150,0,100))# 100# 静态方法的使用场景# - 与类功能相关的工具函数# - 不需要访问self或cls# - 放在类中是为了组织代码命名空间三、选型决策# ⌨️ 决策树classExample:class_attr共享数据def__init__(self):self.instance_attr私有数据# 问题1需要访问实例数据(self.xxx)吗# → 是用实例方法defneeds_instance_data(self):returnself.instance_attr# 访问self# 问题2需要访问类数据(cls.xxx)或创建实例吗# → 是用类方法classmethoddefneeds_class_data(cls):returncls.class_attr# 访问cls# 问题3功能和类相关但不需要访问self或cls# → 用静态方法staticmethoddefutility_function(x,y):returnxy# 纯工具函数# 问题4功能和类完全无关# → 不要放在类里——写成模块级函数四、实战完整的用户管理系统fromdatetimeimportdatetimeclassUser:用户类——展示三种方法的完整使用_users[]# 类属性所有用户_next_id1def__init__(self,name,email,roleuser):self.idUser._next_id User._next_id1self.namename self.emailemail self.rolerole self.created_atdatetime.now()self._activeTrueUser._users.append(self)# 实例方法——操作单个用户 defdeactivate(self):self._activeFalsedefreactivate(self):self._activeTruedefis_active(self):returnself._activedefto_dict(self):return{id:self.id,name:self.name,email:self.email,role:self.role,active:self._active,created_at:self.created_at.isoformat(),}# 类方法——管理所有用户 classmethoddeffind_by_email(cls,email):foruserincls._users:ifuser.emailemail:returnuserreturnNoneclassmethoddefget_active_users(cls):return[uforuincls._usersifu.is_active()]classmethoddefget_by_role(cls,role):return[uforuincls._usersifu.rolerole]# 静态方法——验证工具 staticmethoddefvalidate_email(email):importrereturnbool(re.match(r^[\w.-][\w.-]\.\w{2,}$,email))staticmethoddefvalidate_name(name):returnlen(name.strip())2# 使用u1User(张三,zstest.com)u2User(李四,lstest.com,roleadmin)u3User(王五,wwtest.com,rolemoderator)u3.deactivate()print(f活跃用户:{len(User.get_active_users())})# 2print(f管理员:{[u.nameforuinUser.get_by_role(admin)]})# [李四]print(User.validate_email(invalid))# False五、总结三种方法各司其职实例方法操作实例类方法操作类静态方法提供工具。速查表方法类型装饰器第一参数典型场景实例方法无self操作实例属性类方法classmethodcls替代构造器、工厂方法静态方法staticmethod无工具函数、验证器✅选择很简单需要self→实例方法需要cls→类方法都不需要但和类相关→静态方法完全无关→模块函数。
网站建设
高端定制
企业官网