一、隐藏数据
隐藏数据通常是指对数据进行封装或隐藏,使其对外部代码不可见或不可直接访问。这是一种重要的编程概念,被称为"信息隐藏"或"封装",是面向对象编程的核心特性之一。通过隐藏数据,可以增加代码的安全性、可维护性和灵活性。。Python中隐藏数据的主要目的是保护数据不被意外或恶意地篡改,同时提供统一的访问接口以便于后续代码的维护和扩展。
方法:
1.使用私有成员:在Python中,可以使用双下划线(__)作为成员变量的前缀,将其定义为私有成员。私有成员只能在类的内部访问,无法直接从类的外部访问。
class MyClass:
def __init__(self):
self.__private_data = 42
def get_data(self):
return self.__private_data
obj = MyClass()
print(obj.get_data()) # Output: 42
# print(obj.__private_data) # 无法直接访问,会引发 AttributeError
运行结果:
2.使用属性(Property):Python中的属性是一种特殊的方法,可以在访问类成员时进行自定义操作。通过使用属性,可以对访问数据进行控制和验证。
class MyClass:
def __init__(self):
self.__private_data = 42
@property
def data(self):
return self.__private_data
obj = MyClass()
print(obj.data) # Output: 42
# obj.data = 10 # 无法直接设置属性,会引发 AttributeError
运行结果:
3.使用getter和setter方法:另一种隐藏数据的方法是通过定义getter和setter方法来访问和修改私有成员。
class MyClass:
def __init__(self):
self.__private_data = 42
def get_data(self):
return self.__private_data
def set_data(self, value):
self.__private_data = value
obj = MyClass()
print(obj.get_data()) # Output: 42
# obj.__private_data = 10 # 无法直接访问,会引发 AttributeError
obj.set_data(10)
print(obj.get_data()) # Output: 10
运行结果:
4.应用示例:
#__init__()方法的调用
#定义汽车类
class Car:
def __init__(self):
self.wheelNum = 4
self.color='蓝色'
#def move(self):
#print('车在跑,目标:夏威夷')
#创建对象
BMW=Car()
print('车的颜色为%s'%BMW.color)
print('车轮胎数量为:%d'%BMW.wheelNum)
运行结果:
二、实现__del__()方法
创建对象后,python解释器默认调用__init__()方法;
当删除一个对象时,python解释器也会默认调用一个方法,这个方法是__del__()方法
1.__del__()方法:
import time
class Animal(object):
def __init__(self,name):
print('__init__方法被调用')
self.__name=name
#析构方法
#当对象被删除时,会自动被调用
def __del__(self):
print("__del__方法被调用")
print("%s对象马上被干掉了..."%self.__name)
#创建对象
dog=Animal("哈皮狗")
#删除对象
del dog
cat=Animal("波斯猫")
cat2=cat
cat3=cat
print("---马上 删除cat对象")
del cat
print("---马上 删除cat2对象")
del cat2
print("---马上 删除cat3对象")
del cat3
print("程序2秒钟后结束")
time.sleep(2)
运行结果:
三、继承
继承是面向对象编程的重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。继承使得代码重用和扩展变得更加容易。子类可以继承父类的特性,并且可以在不修改父类的情况下添加新的功能或修改已有的功能。通过继承,我们可以在子类中扩展父类的功能,同时保持代码的简洁和可维护性
1.继承关系的语法:
class ParentClass:
# 父类的属性和方法
class ChildClass(ParentClass):
# 子类的属性和方法
2.如何使用继承:
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
pass
class Dog(Animal):
def make_sound(self):
return "Woof!"
class Cat(Animal):
def make_sound(self):
return "Meow!"
# 创建子类的实例并调用继承的方法
dog = Dog("Buddy")
cat = Cat("Whiskers")
print(dog.name) # Output: Buddy
print(dog.make_sound()) # Output: Woof!
print(cat.name) # Output: Whiskers
print(cat.make_sound()) # Output: Meow!
运行结果:
3.继承示例:
#定义一个父类
class Cat(object):
def __init__(self,name,color="白色"):
self.name=name
self.color=color
def run(self):
print("%s--在跑"%self.name)
#定义一个子类,继承Cat类如下:
class Bosi(Cat):
def setNewName(self,newName):
self.name=newName
def eat(self):
print("%s--在吃"%self.name)
bs=Bosi("印度猫")
print('ba的名字为:%s'%bs.name)
print('bs的颜色为:%s'%bs.color)
bs.eat()
bs.setNewName('波斯')
bs.run()
运行结果:
4.应用示例
①子类在继承的时候,在定义类时,小括号()中为父类的名字
②父类的属性、方法,会被继承给子类
class Animal(object):
def __init__(self,name='动物',color='白色'):
self.__name=name
self.color=color
def __test(self):
print(self.__name)
print(self.color)
def test(self):
print(self.__name)
print(self.color)
class Dog(Animal):
def dogTest1(self):
#print(self.__name)
#不能访问到父类私有属性
print(self.color)
def dogTest2(self):
#self.__test()
#不能访问父类的私有方法
self.test()
A=Animal()
#print(A.__name)
#程序出现一场,不能访问私有属性
print(A.color)
#A.__test()
#程序出现异常,不能访问私有方法
A.test()
print("------分割线------")
D=Dog(name="小花狗",color="黄色")
D.dogTest1()
D.dogTest2()
运行结果: