8.类与对象
8.1 面向对象
面向对象的三大基本特征: 封装、继承、多态。
在面向对象编程中,封装(Encapsulation)是一种将数据和操作(方法)组合在一起的机制。通过封装,我们可以隐藏数据的具体实现细节,只暴露出一些对外的接口,外部程序只能通过这些接口来访问和操作数据。
封装的主要目的是保护数据的安全性和完整性,防止外部程序直接修改数据,导致不可预料的错误。同时,封装也提供了简化操作的便利性,对外部程序来说,只需要关注公开的接口,而不需要关心具体的实现方式。
在封装中,通常会将数据声明为私有的(private),并提供一些公开的方法(public methods)来获取和修改数据。这些公开的方法可以对数据进行一些校验和处理,保证数据的有效性和一致性。
封装也有助于实现代码的可维护性和可扩展性,通过封装,我们可以将修改数据和操作的逻辑集中在一个地方,方便后续的修改和扩展。
总结来说,封装是一种将数据和操作组合在一起的机制,通过封装可以隐藏数据的实现细节,保护数据的安全性,提供简化操作的接口,并提高代码的可维护性和可扩展性。
继承是面向对象编程中的一个重要概念,它允许一个类(称为子类或派生类)从另一个类(称为父类、基类或超类)继承属性和方法。
子类可以继承父类的属性和方法,并且还可以添加自己的特定属性和方法。这样可以实现代码的重用和扩展。
多态是面向对象编程中的一个概念,指的是同一个方法在不同对象上的不同表现形式。简单说,就是通过使用父类的引用指向子类的对象,实现对不同子类对象调用同一个方法时产生不同的结果。
8.2 类与对象
8.2.1 类与对象的关系
类与对象的关系是一种包含与被包含的关系。
类是对一类具有相同属性和行为的对象的抽象描述,它定义了对象的属性和方法。它可以看作是一个模板或蓝图,描述了对象应该具有的特征和行为。
对象是类的实例化,是具体存在的实体,它具有类定义的属性和方法。
类和对象的关系可以用类比现实生活中的一对模具和铸件的关系。类就像是一个模具,定义了对象的特征和行为;对象就像是具体的铸件,是根据模具创建出来的实体。
类与对象的关系还可以用包含与被包含的关系来理解。一个类可以包含多个对象,这些对象都是类的实例化。而一个对象则包含类定义的属性和方法。
总结来说,类是对一类对象的抽象描述,对象是类的实例化,它们之间是一种包含与被包含的关系。
8.2.2 类的定义与访问
class 类名:
属性名=属性值
def 方法名(self):
方法体
>>> class Car:
wheels=4
def drive(self):
print('开车方法')
def stop(self):
print('停车方法')
>>>
在Python中,self是一个特殊的参数,它代表当前对象实例本身。通过使用self,我们可以在类的方法中引用和操作对象的属性和方法。
在类的方法中,通常第一个参数会被命名为self,用于接收当前对象的引用。当我们调用对象的方法时,Python会自动将对象本身作为第一个参数传递给self。
使用self可以让类的方法操作对象的属性和方法。通过self,我们可以访问和修改对象的属性,调用对象的其他方法,以及在方法中创建临时变量。
实际上,self并不是Python中固有的关键字,我们可以用其他名称来代替self,但约定俗成的做法是使用self。在方法的定义和调用中,都应遵循这个约定,以保持代码的可读性和一致性。
例如,下面是一个简单的示例,演示了如何在类的方法中使用self:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")
person1 = Person("Alice", 25)
person1.say_hello() # 输出: Hello, my name is Alice and I am 25 years old.
在上面的例子中,self被用于访问对象的name和age属性。当调用person1对象的say_hello方法时,self会自动接收person1对象的引用,并以此访问和操作对象的属性。
8.2.3 对象的创建与使用
①对象的创建
对象名=类名()
my_car=Car
②访问对象成员
对象名.属性
对象名.方法()
class Car:
wheels=4
def drive(self):
print('开车方法')
def stop(self):
print('停车方法')
my_car=Car() #创建对象
print(my_car.wheels)#访问对象的成员属性
my_car.drive() #访问对象的成员方法
8.2.4 访问限制
①定义私有成员
__属性名
__方法名
②私有成员的访问
>>> class PersonInfo:
__weight=55
def __info(self):
print(f'我的体重是:{__weight}')
>>> person=PersonInfo()
>>> person.__weight #类外不访问私有成员,会报错
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
AttributeError: 'PersonInfo' object has no attribute '__weight'
>>> person.__info()
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
AttributeError: 'PersonInfo' object has no attribute '__info'
>>>
(1) 访问私有属性
可以通过访问公有方法间接访问私有属性
>>> class PersonInfo:
__weight=55
def get_weight(self):
print(f'我的体重是:{self.__weight}kg')
>>> person=PersonInfo()
>>> person.get_weight()
我的体重是:55kg