在Python中的封装
封装是面向对象编程(OOP)中最基本的概念之一。它是将处理数据的数据和方法封装在一个单元中的概念。这样可以通过限制对变量和方法的访问来防止数据的意外修改。对象的方法可以更改变量的值以防止意外更改。这些变量被称为私有变量。
封装是通过封装所有数据(如成员函数、变量等)的类来演示的。
看一个实际的封装示例。一个公司有许多部门,例如财务部和销售部。财务部负责管理所有财务交易并跟踪所有数据。销售部也负责处理所有与销售相关的活动。他们记录了所有销售记录。有时,财务部门的人员可能需要某个特定月份的所有销售数据。在这种情况下,他无权访问销售部门的数据。首先,他需要联系销售部门的另一个工作人员请求数据。这就是封装。销售部门的数据以及能够操作该数据的员工都被统称为“销售部门”。封装是隐藏数据的另一种方式。这个示例显示了销售、财务和账户等部门的数据对其他部门都是隐藏的。
保护成员
C++和Java中的保护成员是类的成员,只能在类内部访问,而不能被外部任何人访问。在Python中,可以通过遵循约定并在名称前面加上一个下划线来实现。
保护变量可以从类和派生类中访问(它也可以在派生类中进行修改),但通常不会在类体外部访问它。
__init__ 方法是构造函数,当实例化某个类型的对象时会运行。
示例:
# Python program for demonstrating protected members
# first, we will create the base class
class Base1:
def __init__(self):
# the protected member
self._p = 78
# here, we will create the derived class
class Derived1(Base):
def __init__(self):
# now, we will call the constructor of Base class
Base1.__init__(self)
print ("We will call the protected member of base class: ",
self._p)
# Now, we will be modifing the protected variable:
self._p = 433
print ("we will call the modified protected member outside the class: ",
self._p)
obj_1 = Derived1()
obj_2 = Base1()
# here, we will call the protected member
# this can be accessed but it should not be done because of convention
print ("Access the protected member of obj_1: ", obj_1._p)
# here, we will access the protected variable outside
print ("Access the protected member of obj_2: ", obj_2._p)
输出:
We will call the protected member of base class: 78
we will call the modified protected member outside the class: 433
Access the protected member of obj_1: 433
Access the protected member of obj_2: 78
私有成员
私有成员与受保护成员相同。不同之处在于,被声明为私有的类成员不应该被类外部或任何基类访问。Python没有私有实例变量可以在类外部被访问。
但是,要定义一个私有成员,需要在成员的名称前加上双下划线 “__” 。
Python的私有和安全成员可以使用Python名称混淆从类外进行访问。
示例如下:
class Base1:
def __init__(self):
self.p = "Javatpoint"
self.__q = "Javatpoint"
# Creating a derived class
class Derived1(Base1):
def __init__(self):
# Calling constructor of
# Base class
Base1.__init__(self)
print("We will call the private member of base class: ")
print(self.__q)
# Driver code
obj_1 = Base1()
print(obj_1.p)
输出:
Javatpoint