Python面向对象程序设计:类的定义、实例化、封装与私有变量详解
本文详解Python面向对象编程中类的定义、实例化及封装机制。重点解析私有变量与方法的双下划线命名规则、类内外部访问限制,以及通过名称改写实现私有属性访问的原理与注意事项。
本文通过具体示例,深入解析Python面向对象程序设计中的类定义、实例化过程,以及封装机制与私有变量/方法的使用规则。内容旨在帮助读者掌握核心概念,供参考学习。
1. 定义类
在Python中,定义类的标准语法格式如下:
class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2
def __func1(self):
print("MyClass类的私有方法被调用!")
def print_data(self):
self.__func1()
print(self.__data1)
print(self.data2)
def setData(self,data):
self.__data1=data
class1=MyClass('first_data','sencond_data')
class1.print_data()
class1._MyClass__func1()
类定义以关键字 class 开头,随后紧跟类名,通常遵循大驼峰命名法(首字母大写)。类名后的括号内指定父类,若未显式继承其他类,则默认继承 object 类。object 是所有类的基类。
__init__ 是类的构造函数,用于初始化类的变量。每当该类被实例化时,系统会自动先执行此构造函数。
在类中定义的任何函数,其第一个参数必须为 self,它代表类的当前实例化对象。在调用这些方法时,无需显式传递该参数。
2. 类的实例
类的实例化操作如下:
obj=MyClass(x,x)
obj 代表生成的类实例对象,MyClass 为类名,括号内的参数为类的初始化变量(若类定义中包含)。
情况一:类的初始属性为空
class MyClass(object):
def __init__(self):
print("MyClass类的构造方法被调用!")
class1=MyClass()
情况二:类含有初始属性
class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2
class1=MyClass('first_data','sencond_data')
print(class1.data2)
3. 类的封装
封装、继承和多态是面向对象编程的三大特征。类的封装包含两层含义:一是对数据(属性)的封装,二是对实现逻辑(方法)的封装。
数据(属性)的封装
参考前述示例:
class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2
class1=MyClass('first_data','sencond_data')
print(class1.data2)
在此例中,类 MyClass 的实例化对象 class1 拥有两个属性:data1 和 data2。其中,data1 是私有属性,仅限类内部使用;data2 是公有属性,可在类外部访问。这种对属性的访问控制即为数据封装。
实现逻辑(方法)的封装
class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2
def printMax(self):
if self.__data1>self.data2:
print(self.__data1)
else:
print(self.data2)
class1=MyClass(66,88)
class1.printMax()
上述类中的 printMax 函数实现了比较两个数据大小并打印的功能。该逻辑在类外部不可见,外部仅能调用接口,如同操作一个黑盒子,这体现了实现逻辑(方法)的封装。
4. 类的私有属性
可以在类内部定义私有属性和方法。私有成员仅属于类内部,在类外部无法直接访问。在Python中,定义私有属性和私有方法的方式是在名称前添加两个下划线“__”。
私有属性(变量)
class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2
class1=MyClass(66,88)
print(class1.data2)
print(class1.__data1)
上例中,data2 是公有变量,可在类外部访问,因此 class1.data2 有效。而 data1 是类的私有属性,类外部无法直接访问,若尝试使用 class1.__data1 会报错:'MyClass' object has no attribute '__data1'。
私有方法
class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2
def __func1(self):
print("MyClass类的私有方法被调用!")
def print_data(self):
self.__func1()
print(self.__data1)
print(self.data2)
class1=MyClass(66,88)
class1.print_data()
#class1.__func1()
上例中,print_data 是类的公有方法,可在类外部直接调用;__func1 是类的私有方法,不可在类外部直接调用。然而,可以通过类内的公有方法 print_data 来调用私有的 __func1 方法,即私有方法可在类内部被调用。
5. 类外访问类的私有属性
类的私有属性旨在防止外部代码随意访问或更改对象内部的数据和方法。
尽管私有属性在类外不可直接访问,但仍可通过以下两种方式访问或修改:一是通过类内的公有函数进行修改,二是通过“名称改写”机制进行访问(常被称为“非法修改”或“名称修饰”)。
通过类内的公有函数修改
class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2
def setData1(self,data):
self.__data1=data
def printData1(self):
print(self.__data1)
class1=MyClass(66,88)
class1.setData1(100)
class1.printData1()
名称改写机制访问
Python解释器之所以限制从类外部直接访问私有属性或方法,是因为它将私有的属性或方法 __xx 对外展示为 _Class__xx 的形式,即单下划线加上类名再加上双下划线和原名称。因此,如果执意访问,仍可在类外部通过这种改写后的名称“非法”访问私有属性。
class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2
def printData1(self):
print(self.__data1)
class1=MyClass(66,88)
print(class1._MyClass__data1)
通常不建议采用这种方式,因为不同的Python编译器或版本可能对私有属性/方法的包装命名有所不同。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









