Python中类方法、静态方法、实例方法是否能访问类属性和实例属性
文章目录
- Python中类方法、静态方法、实例方法是否能访问类属性和实例属性
- 1. 实例方法(最常用,第一个参数 self)
- 2. 类方法 @classmethod(参数 cls,代表当前类)
- 3. 静态方法 @staticmethod(无 self/cls 参数)
- 补充:强行在类 / 静态方法拿实例属性(不规范)
- 完整代码
- 类属性:定义在类里面、方法外面,类名.属性 / cls.属性
- 实例属性:init 中 self.属性,绑定单个对象

1. 实例方法(最常用,第一个参数 self)
class Demo:
cls_attr = "类属性" # 类属性
def __init__(self):
self.obj_attr = "实例属性" # 实例属性
def func(self):
print(self.cls_attr) # 访问类属性 ✅
print(self.obj_attr) # 访问实例属性 ✅
- self指向实例对象,既能通过 self 拿实例属性,也能通过 self 访问类属性。
2. 类方法 @classmethod(参数 cls,代表当前类)
@classmethod
def cls_func(cls):
print(cls.cls_attr) # 通过cls访问类属性 ✅
# print(cls.obj_attr) # 报错!cls是类,没有实例属性 ❌
-
cls是类本身,只能访问类属性;没有实例对象,无法直接访问实例属性。
特例:传入实例对象手动访问(不推荐):obj.obj_attr,不属于方法原生权限。
3. 静态方法 @staticmethod(无 self/cls 参数)
@staticmethod
def sta_func():
print(Demo.cls_attr) # 类名.类属性 ✅
# print(Demo.obj_attr) # 报错 ❌
- 不属于类也不属于实例,只能用「类名。类属性」访问类属性;没有实例引用,不能直接访问实例属性。
一句话速记
补充:强行在类 / 静态方法拿实例属性(不规范)
必须手动传入实例对象:
@classmethod
def cls_func(cls, ins):
print(ins.obj_attr)
d = Demo()
Demo.cls_func(d)
只是参数传参,不是方法本身自带访问权限
完整代码
class Demo:
cls_attr = "类属性"
def __init__(self):
self.obj_attr = "实例属性" # 实例属性
def func(self):
print(self.cls_attr) # 访问类属性
print(self.obj_attr) # 访问实例属性
@classmethod
def cls_func(cls):
print(cls.cls_attr) # 通过cls访问类属性 ✅
print(cls.obj_attr) # 报错!cls是类,没有实例属性 ❌
@staticmethod
def sta_func():
print(Demo.cls_attr) # 类名.类属性 ✅
# print(Demo.obj_attr)
@classmethod
def cls_func2(cls, ins):
print(ins.obj_attr)
if __name__ == '__main__':
d = Demo()
Demo.cls_func2(d)


