Python面向对象编程:深入解析class、instance与self的核心机制
本文深入解析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 用法的详解即为全部内容,希望能为大家提供参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









