Python学习之私有函数、私有变量及封装详解
一、私有函数和私有变量
在Python中,我们可以使用下划线(_)来表示一个函数或者变量是“私有”的(private)。所谓的“私有”就是说,只有在类内部才能够访问这些函数或者变量,在类外部是无法直接访问的。例如:
class MyClass:
def __init__(self):
self.__private_var = 1 # 私有变量
self.public_var = 2 # 公有变量
def __private_func(self): # 私有函数
print("This is a private function.")
def public_func(self):
print("This is a public function.")
self.__private_func() # 类内部可以访问私有函数
print(self.__private_var) # 类内部可以访问私有变量
从上面的代码可以看出,两个下划线括起来的变量和函数,就是私有变量和私有函数。在类的外部是无法直接访问的,如果在类外部使用以下代码:
mc = MyClass()
print(mc.__private_var) # 会报错:AttributeError: 'MyClass' object has no attribute '__private_var'
mc.__private_func() # 会报错:AttributeError: 'MyClass' object has no attribute '__private_func'
会导致抛出"AttributeError"异常。但是,在类内部是可以直接访问私有函数和私有变量的。
二、封装
上面介绍了私有函数和私有变量,但是这些私有成员变量和函数并不是完全不能访问,在类的内部是可以使用的。但是,在类的外部是无法访问的,这就保护了这些变量或者函数的作用只包含在类内部,避免了类的外部的误操作对类的内部造成影响。
这种“保护”的思想就是封装(Encapsulation)。在Python中,我们可以通过定义类的属性来实现对私有成员变量和函数的封装。下面使用一个例子来说明封装的重要性。
class Person:
def __init__(self, name):
self.__name = name
self.age = 30
def say_hello(self):
print(f"Hello, my name is {self.__name}.")
person = Person("Tom")
person.say_hello() # 可以正常输出:Hello, my name is Tom.
print(person.age) # 可以正常输出:30
print(person.__name) # 会报错:AttributeError: 'Person' object has no attribute '__name'
上面的代码中,我们在类的属性中将名字“name”定义成了一个私有成员变量,这样就保证了外部无法直接访问这个变量。而公有变量“age”,则可以通过外部直接访问。这么做的目的是为了防止外部的误操作,保护类内部变量的安全性。
三、总结
Python的私有函数和私有变量可以通过使用双下划线来实现(例如:__private_func、__private_var),在类的外部是无法直接访问,但是在类的内部是可以使用的。封装是一种保护数据安全的重要思想,可以通过定义类的属性来实现对私有成员变量和函数的封装,从而保证了数据的安全性。
四、示例说明
1. 私有成员变量的示例
在下面这个示例中,我们使用BankAccount类来模拟一个银行账户,其中包含银行账户的账号和余额。由于这些信息可能不希望在外部被随意修改,因此我们将这两个属性定义为私有变量,外部无法进行修改,在类的内部则可以通过定义set和get方法来修改和获取账户信息。
class BankAccount:
def __init__(self, account, balance):
self.__account = account # 私有变量
self.__balance = balance # 私有变量
def get_account(self):
return self.__account
def set_account(self, account):
self.__account = account
def get_balance(self):
return self.__balance
def set_balance(self, balance):
self.__balance = balance
account = BankAccount("1234", 1000)
print(account.get_account(), account.get_balance()) # 打印出账户信息:1234 1000
# account.__account = "5678" # 报错:AttributeError: 'BankAccount' object has no attribute '__account'
account.set_account("5678")
print(account.get_account()) # 打印出账户信息:5678
2. 私有成员函数的示例
在下面这个示例中,我们使用OnePay类来模拟一个移动支付App,其中包含了支付功能和充值功能,并且采用了私有成员函数示例,确保这些关键的操作只能在类内部进行。
class OnePay:
def __init__(self, balance):
self.__balance = balance # 私有变量
def __pay(self, money):
if money > self.__balance:
print(f"Pay failed due to insufficient balance, please keep your balance over {money} yuan.")
return False
else:
self.__balance -= money
print(f"Pay success, balance is {self.__balance} yuan.")
return True
def __recharge(self, money):
self.__balance += money
print(f"Recharge success, balance is {self.__balance} yuan.")
def pay(self, money):
return self.__pay(money)
def recharge(self, money):
return self.__recharge(money)
onepay = OnePay(100)
onepay.pay(120) # 支付失败,因为余额不足
onepay.recharge(100)
onepay.pay(120) # 支付失败,因为余额不足
onepay.pay(80) # 支付成功
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python学习之私有函数,私有变量及封装详解 - Python技术站