python 面向对象编程(2)

在这里插入图片描述

前言

前面我们介绍了 python 类和对象以及继承、私有权限,那么今天我们将来介绍 python面向对象 剩下的两大特性封装、多态,以及如何访问、修改类属性、类方法和静态方法的介绍。???

封装

Python中的封装是一种面向对象编程的概念,它将数据和操作这些数据的方法封装到一个单独的单元中,这个单元通常被称为类(Class)。封装的基本思想是将数据和相关的操作(方法)组合在一起,形成一个相对独立的、可复用的整体。

封装的目的是隐藏对象的内部实现细节,只向外部暴露一些必要的接口,通过这些接口来访问和操作对象的状态。这样做的好处是增强了代码的可读性和可维护性,同时也提高了代码的安全性。

我们在类中定义的属性和方法都可以看做是封装。

class Person():
    name = 'zhangsan'
    age = 18
    gender = 'man'
    
    def print_info(self):
        print(f'一位名叫{self.name}{self.age}{self.gender}')

定义name、age、gender以及方法print_info都叫做封装。

多态

多态是一种可以根据不同的对象类型执行不同的操作的能力。它允许多个不同的对象对相同的消息作出响应,以各自独特的方式执行操作,从而实现了代码的灵活性和可扩展性。

在 Python 中,多态性是通过方法的动态绑定和方法重写来实现的。具体来说,当一个对象调用一个方法时,实际执行的是与对象类型相关联的方法。

python 的多态不是只能依赖于继承,但是最好依赖于继承。

python 多态的实现步骤:

  1. 定义父类,并提供公共方法
  2. 定义子类,并重写父类方法
  3. 传递子类对象给调用者,可以看到不同子类执行效果不同
class Animal():
    def speak(self):
        pass

class Cat(Animal):
    def speak(self):  # 重写父类方法来实现多态
        print('喵喵喵')

class Dog(Animal):
    def speak(self):  # 同样重写父类方法,实现多态
        print('汪汪汪')

cat = Cat()
dog = Dog()
cat.speak()  # 喵喵喵
dog.speak()  # 汪汪汪

我们通过继承自一个父类的实例对象来调用同一个方法而实现了不同的功能,这就是多态的灵活性。

类属性和实例属性

定义以及访问类属性

  • 类属性就是类对象所拥有的属性,它被该类的所有实例对象所共有
  • 类属性可以通过类对象或实例对象访问
class Person():
    name = 'zhangsan'

person1 = Person();
print(person1.name)  # 通过实例对象来访问类属性  zhangsan
print(Person.name)  # 通过类对象来访问类属性  zhangsan

修改类属性

修改类属性只能使用 类名.类属性 = 值 来修改类属性。

class Person():
    name = 'zhangsan'

person1 = Person();
Person.name = 'lisi'
print(Person.name)  # lisi
print(person1.name)  # lisi

那么如果我们要使用 实例对象.类属性 = 值 会出现什么情况呢?

class Person():
    name = 'zhangsan'

person1 = Person();
person1.name = 'lisi'
print(Person.name)  # zhangsan
print(person1.name)  # lisi

**如果我们使用 实例对象.类属性 = 值 实际上修改的是实例属性。

实例属性

实例属性其实是另外开辟了一份与类属性同名的一块内存,修改实例属性并不会影响类属性。
在这里插入图片描述

class Person():
    name = 'zhangsan'

person1 = Person()
person2 = Person()
print(person1.name)  # zhangsan
print(person2.name)  # zhangsan
person1.name = 'lisi'
print(person1.name)  # lisi
print(person2.name)  # zhangsan
person2.name = 'wangwu'
print(person1.name)  # lisi
print(person2.name)  # wangwu

在这里插入图片描述

  • 类的实例记录的某项数据始终保持一致时,则定义类属性。
  • 实例属性要求每个对象为其单独开辟一份内存空间来记录数据,而类属性为全类所共有,仅占用一份内存,更加节省内存空间。

类方法

在 Python 中,类方法是一种特殊类型的方法,它与类本身相关联而不是与实例(对象)相关联。类方法可以在不创建类实例的情况下访问和操作类的属性和方法。

要定义一个类方法,需要使用 @classmethod 装饰器,将其放置在方法定义的上方。类方法的第一个参数通常被命名为 cls,它表示对类本身的引用。通过这个参数,可以访问类的属性和调用其他类方法。

  • 当方法中需要使用类对象 (如访问私有类属性等)时,定义类方法
  • 类方法一般和类属性配合使用
class Account():
    Account_name = '1234567'
    __Account_password = '987654'

    @classmethod
    def get_password(cls):
        return cls.__Account_password

result1 = Account.get_password()
print(result1)  # 987654
account1 = Account()
result2 = account1.get_password()
print(result2)  # 987654

静态方法

在 Python 中,静态方法是一种与类相关联的方法,它不需要访问类的实例或实例的属性。静态方法可以在不创建类实例的情况下调用,它归属于类而不是对象。

要定义一个静态方法,需要使用 @staticmethod 装饰器,将其放置在方法定义的上方。静态方法没有特殊的参数,它们不会自动传递类或实例的引用。

class Person():
    @staticmethod
    def print_info():
        print('这是一个静态方法')

Person.print_info()  # 这是一个静态方法
person1 = Person()
person1.print_info()  # 这是一个静态方法
  • 静态方法能够通过实例例对象和类对象去访问
  • 当方法中 既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象 (如类属性、类方法、创建实例等)时,定义静态方法
  • 取消不需要的参数传递,有利于减少不不必要的内存占用和性能消耗

在这里插入图片描述