Python类变量与成员变量、类方法与静态方法详解

沈知远
沈知远
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析Python面向对象编程中的核心概念,详细区分类变量与成员变量的定义、调用优先级及修改影响。同时对比分析类方法、静态方法与成员方法的参数传递机制及使用场景,并通过代码示例说明下划线在命名规范中的作用,帮助开发者掌握Python类的正确用法。

Python类变量与成员变量详解

本文详细介绍Python面向对象编程中类变量与成员变量、类方法与成员方法的实际应用与区别,供读者参考学习。

类变量与成员变量的定义

在类体内部直接定义的变量被称为类变量(也称为静态成员变量)。

在init()函数中定义并绑定到实例对象上的变量,被称为成员变量(实例变量)。

类变量可以直接通过类名进行访问和调用。

当类变量与成员变量同名时:

若通过实例对象访问,Python会优先返回成员变量的值。

若通过类名访问,则返回类变量的值。

当仅存在类变量而成员变量不存在时:

通过实例对象访问时,Python会先查找该实例是否有对应的成员变量。

若实例中未找到该成员变量,Python会自动向上查找并返回类变量的值。

当仅存在成员变量而类变量不存在时:

若尝试通过类名直接访问,Python会抛出错误,因为类本身没有该属性。

核心总结:

类变量既可以通过类名调用,也可以通过实例对象调用;而成员变量只能通过实例对象调用。

通过实例对象修改类属性时,实际上是在该实例上创建或修改了一个同名的成员变量,这不会影响类变量本身。

若通过类名修改类属性,则直接修改的是类变量的值,所有未覆盖该属性的实例将受到影响。


class Person(object):
  # 类变量
  name = "haha"
  age = "19"
  height = 170
  def __init__(self,name,age,weight):
    # 成员变量
    self.name = name
    self.age = age
    self.weight = weight
  def sayHeight(self):
    print(self.height)
per = Person("xiaoming",19,50)
print(per.name)
print(Person.name)
# print(Person.weight)
per.height = 190
print(per.height)
print(Person.height)
print('*********')
Person.height = 200
print(Person.height)
print(per.height)
per.sayHeight()

运行结果示例:

xiaoming haha 190 170 ********* 200 190 190

Python类方法与静态方法解析

类方法与成员方法的区分

类方法与成员方法的概念

类方法:通常通过类名进行调用的方法。

成员方法:通常通过实例对象进行调用的方法。

如果方法定义在类中且没有参数(通常指省略了默认的self参数),则只能通过类名直接调用。

若方法需要操作类的实例数据,则必须先实例化类,生成对象后调用。


class Person(object):
  def __init__(self,name,age):
    self.name = name
    self.age = age
  def say(self):
    print("I am %s, I am %d year old"%(self.name,self.age))
  def sayHello():
    print('hello I am class function')
per = Person("xiaoming",19)
per.say()
Person.sayHello()

运行结果示例:

I am xiaoming, I am 19 year old hello I am class function

类方法与静态方法的对比

静态方法:

调用静态方法时,不会自动将类的实例(self)或类本身(cls)作为第一个参数传递。

静态方法是在类中定义的普通函数。

无需实例化类即可直接调用,且在继承体系中,其定义行为不可变。

类方法:

调用类方法时,Python会自动将调用该方法所属的类作为第一个参数(cls)传递。


class A(object):
    def foo(self, x):
      print("executing foo(%s, %s)" % (self, x))
    @classmethod
    def class_foo(cls, x):
      print("executing class_foo(%s, %s)" % (cls, x))
    @staticmethod
    def static_foo(x):
      print("executing static_foo(%s)" % x)
  a = A()
  # 调用foo函数,参数传入1
  a.foo(1)
  # 调用class_foo,参数传入1
  A.class_foo(1)
  # 调用static_foo,参数传入1
  A.static_foo(1)
  a.static_foo(1):

运行结果示例:

executing foo(<__main__.A object at 0x0000024F126489B0>, 1) executing class_foo(<class '__main__.A'>, 1) executing static_foo(1) executing static_foo(1)

Python命名规范中的下划线用法

命名规范中的下划线

下划线用于定义特殊方法或变量,通常由系统保留或遵循特定约定, 例如:

__init()__、__del()__

前双下划线(如):表示私有变量(private),仅能在类内部访问,外部无法直接访问。例如__age。

单下划线(如):表示受保护变量(protected)。

受保护变量允许类本身及其子类访问,但在使用from module import *导入时不会被导入。

尽管使用单下划线开头的变量在技术上仍可被访问,但应将其视为受保护变量,尽量避免在外部直接访问。

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。