python 面向对象编程(2)

简介: 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()  # 这是一个静态方法


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


相关文章
|
2月前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
35 2
|
2月前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
27 1
|
7月前
|
Python
Python编程作业五:面向对象编程
Python编程作业五:面向对象编程
76 1
|
7月前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
3月前
|
存储 Java 程序员
30天拿下Python之面向对象编程
30天拿下Python之面向对象编程
23 3
|
3月前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
|
3月前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
2月前
|
Java Python
Python学习六:面向对象编程(上)
这篇文章是关于Python面向对象编程的基础知识,包括类和对象的概念、实例方法、属性、self关键字以及魔法方法等。
20 0
|
4月前
|
Python
Python 中的面向对象编程 (OOP)
【8月更文挑战第29天】
45 7
|
4月前
|
机器学习/深度学习 PHP 开发者
探索PHP中的面向对象编程构建你的首个机器学习模型:以Python和scikit-learn为例
【8月更文挑战第30天】在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、易于管理和维护。本文将深入探讨PHP中面向对象的魔法,从类和对象的定义开始,到继承、多态性、封装等核心概念,再到实战中如何应用这些理念来构建更健壮的应用。我们将通过示例代码,一起见证PHP中OOP的魔力,并理解其背后的设计哲学。