python静态方法可以访问对象变量_python-面向对象-09-类方法/静态方法

本文介绍了Python中的类方法和静态方法。类方法通过@classmethod装饰器定义,常用于操作类属性,而静态方法通过@staticmethod装饰器定义,与类对象无关,主要用来实现与类无关的通用功能。类方法和静态方法都不能访问实例属性和实例方法,但可以访问类属性和类方法。在使用时,应根据方法的功能选择合适的方法类型。
摘要由CSDN通过智能技术生成

1.类方法

类方法是从属于"类对象"的方法。类对象可以通过装饰器@classmethod来定义,具体格式如下:

@classmethod

def 类方法名(cls [, 形参列表]):

方法体

要点如下:

@classmethod必须位于方法的上面一行

第一个参数cls(class的缩写,和前面笔记介绍的self类似),必须要有,代指"类对象"本身。

调用类方法格式:类名.类方法名(参数列表)。参数列表中不需要也不能给cls参数进行传值,解释器会自动赋值。

类方法中可以访问实例属性和实例方法会导致错误,因为有类不一定有对象。

子类继承父类方法时,传入cls是自身对象,而非父类对象。(后面的笔记会有介绍)

代码示例:

class Student:

count = 0 # 类属性

"""定义方法"""

@classmethod

def print_count(cls):

"""cls参数代表类对象"""

print(Student.count)

"""调用类方法"""

print("调用时,不传递cls参数")

Student.print_count()

运行结果:

调用时,不传递cls参数

0

2.静态方法

在python中,允许定义于”类对象“无关的方法,称为"静态方法"。

"静态方法"和在模块中定义的普通方法没有什么区别,只不过"静态方法"放到了"类的名字变量空间",需要通过类调用。

静态方法通过装饰器@staticmethod来定义,格式如下:

@staticmethod

def 静态方法名([形参列表]):

方法体

要点如下:

@staticmethod必须位于方法上面一行

调用静态方法格式:类名.静态方法名(参数列表)

静态方法中访问实例属性和实例方法会导致错误

代码示例:

class Student:

count = 0 # 类属性

@staticmethod

def add(a, b):

"""与类无关的静态方法"""

"""因为静态方法从属于类,所以是可以操作类属性和类方法"""

print("{0}+{1}={2}".format(a, b, a+b))

return a + b

# 调用静态方法

Student.add(20, 30)

运行结果:

20+30=50

res=50

3.实例方法/类方法/静态方法的区别

class MyClass:

# 类属性

class_attr = 0

def __init__(self, obj_attr):

self.obj_attr = obj_attr

def instance_method(self):

return "instance method called", self

@classmethod

def class_method(cls):

return "class method called", cls

@staticmethod

def static_method():

return "static method called"

print("调用实例方法")

obj1 = MyClass("obj_attr1")

print(obj1.instance_method())

print("--" * 20)

print("调用类方法")

print(MyClass.class_method())

print("--" * 20)

print("调用静态方法")

print(MyClass.static_method())

运行结果:

调用实例方法

('instance method called', <__main__.myclass object at>)

----------------------------------------

调用类方法

('class method called', )

----------------------------------------

调用静态方法

static method called

注意: 以下讨论的属性、方法均指公开的类型,非私有的。

实例方法:

能读取、修改实例属性

能调用实例方法

能读取、修改类属性

能调用类方法

能调用类静态方法

调用方式:对象名.实例方法名(参数列表),编译器自动传递self参数

类方法:

不能读取、修改实例属性

不能用实例方法

能读取、修改类属性

能调用类方法

能调用类静态方法

调用方式:类名.类方法名(参数列表),编译器自动传递cls参数

静态方法:

不能读取、修改实例属性

不能用实例方法

能读取、修改类属性

能调用类方法

能调用类静态方法

调用方式: 类名.静态方法名(参数列表),不需要cls参数

总结:

类方法和静态方法,功能非常相近,可以相互替代, 但是从规范的角度来说,请按照实例方法操作对象,类方法操作类,静态方法为和类无关的通用方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值