Python面向对象编程:深入解析class、instance与self的核心机制

Ryan
Ryan
发布时间:2026-10-13 | 4人浏览过
原创

本文深入解析Python面向对象编程中的核心概念:类(class)、实例(instance)与self参数。详细阐述如何定义类、通过__init__初始化属性、创建实例对象,以及self在绑定属性和方法调用中的关键作用。同时介绍属性封装技巧,包括使用双下划线实现私有属性及通过API访问内部数据,帮助开发者掌握Python类的高级用法。

Python 类与实例的基础概念

一、Python 的类和实例

在面向对象编程体系中,最核心的概念莫过于类(class)与实例(instance)。类可以被视为一种抽象的模板,而实例则是依据该类模板创建出的具体“对象”。

以“学生”这一概念为例,它是一个较为抽象的集合,拥有诸多属性。我们可以定义一个 Student 类来描述学生,类中预设了分数、身高等属性结构,但此时并未赋予具体数值。相比之下,实例是类生成的具体对象,每个实例都继承自类并具有相同的方法结构,但属性值各异。例如,创建一个名为 hansry 的学生实例,其分数为 93,身高为 176,该实例便拥有了具体的数值数据。

类的定义与初始化方法

1. 类的定义:以 Student 类为例,在 Python 中定义类的语法如下:


class Student(object):
  def __init__(self,name,score):
    self.name=name
    self.score=score

a. (object) 表示该类继承自哪个父类,object 是所有类默认继承的基类。

b. __init__ 方法的第一个参数始终为 self,它指向类创建的实例本身。因此,在 __init__ 方法内部,可以将各种属性绑定到 self 上,因为 self 本身就代表了正在创建的实例。

c. 定义了 __init__ 方法后,创建实例时不能传入空参数,必须提供与 __init__ 方法签名相匹配的参数。注意,self 不需要在调用时显式传入,只需传入 self 之后的参数即可。

实例的创建与属性绑定

2. 实例的创建:定义好类之后,可以通过“类名 + ()”的方式创建 Student 的实例,具体操作如下:


student = Student('name', 93)

>>> student.name
"name"
>>> student.score
93

a. 其中 Student 是类名,('name', 93) 为传入的参数。

b. self.name 是 Student 类的属性变量,归属于 Student 类。同时,name 是外部传入的参数,并非 Student 类自带的默认值。因此,self.name = name 的含义是将外部传入的 name 参数的值赋值给 Student 类自身的属性变量 self.name。

3. 与普通函数的区别:在类中定义函数时,唯一的区别在于第一个参数始终是类的实例变量 self,且在调用时无需传递该参数。除此之外,类的方法(函数)与普通函数无异,同样支持默认参数、可变参数或关键字参数等特性。

类实例的访问与封装

二、类以及实例的访问控制

1. 限制外部对类实例属性的直接访问

数据封装与内部方法定义

既然 Student 类实例本身已拥有这些属性数据,便无需从外部函数访问,而可以在类的内部定义访问数据的函数,从而将“数据”封装起来。这些封装数据的函数与 Student 类本身相关联,被称为类的方法:


class Student(obiect):
  def __init__(self, name, score):
    self.name = name
    self.score = score
  def print_score(self):
    print "%s: %d" % (self.name, self.score)

>>> student= Student("hansry",99)
>>> student.print_property()

hansry:99

由此可见,从外部观察 Student 类,我们仅知创建实例需要提供 name 和 score。至于如何打印,由 Student 类内部定义,数据和逻辑已被封装,调用变得简便,但内部实现细节对外不可见。

若不希望实例中的内部属性被外部直接访问,可将 name 和 score 改为 __name 和 __score,代码如下所示:


class Student(object):

  def __init__(self, name, score):
    self.__name = name
    self.__score = score
  def print_property(self):
    print "%s: %d" %(self.__name,self.__score)

>>> student= Student("hansry",99)
>>> student.print_property()
>>> student.__name()

hansry:99
Traceback (most recent call last):
AttributeError: 'Student' object has no attribute '__name'

通过 API 访问和修改属性

2. 提供 API 使外部代码能够访问并修改内部属性

外部代码访问类实例属性的代码如下:


  def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def get_name(self):
    return self.__name

  def get_score(self):
    return self.__score 

name=student.get_name()
score=student.get_score()
print ("%s,%d" % (name,score))

外部代码修改类内部实例属性的代码如下:


  def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def reset_name(self,change_name):
    self.__name = change_name

  def reset_score(self, change_score):
    self.__score = change_score 

student= Student("hansry",99)
student.print_property()
student.reset_name("simona")
student.reset_score(91)
name=student.get_name()
score=student.get_score()
print ("%s:%d" % (name,score))

hansry:99
simona:91

需要注意的是,在 Python 中,变量名类似 _xxx_ 的,即双下划线开头且以下划线结尾的,属于特殊变量。特殊变量可以直接访问,并非 private 变量,因此不能使用 __name__ 或 __score__ 这种形式。

深入理解 self 参数的机制

三、self 的详细用法解析

self 与类的关系及继承中的表现

1. self 代表类的实例,而非类本身。


class Student(object):
  def print_self(self):
    print(self)
    print(self.__class__)

student=Student()
student.print_self()

<__main__.Student object at 0x7fd9095aed90>
<class '__main__.Student'>

从上述示例可知,self 仅代表类的实例,而 self.__class__ 才指向类本身。

2. 定义类时,务必显式写出 self,因为它代表了类的实例。

3. 在继承场景中,传入的是哪个实例,self 就指向那个实例,而不是指定义 self 的那个类的实例。


class Teacher(object):
  def __init__(self,teacher):
    self.teacher=teacher
    print(self.teacher)

  def print_self(self):
    print(self)

class Student(Teacher):
  def __init__(self,student):
    self.student=student    
    print(self.student)

  def print_self_1(self):
    print(self)

teacher=Teacher("hansry")
student=Student("simona")
student.print_self_1()
student.print_self()

hansry
simona
<__main__.Student object at 0x7fd9095b0950>
<__main__.Student object at 0x7fd9095b0950>

在运行 student.print_self() 时,这里调用了类 Teacher 的 print_self() 函数。此时虽然调用的是类 Teacher 的函数,但此时的实例 self 却是类 Student 实例化时生成的对象。

以上关于 Python 中 class、instance 以及 self 用法的详解即为全部内容,希望能为大家提供参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表