🧑‍🏫
liualexiang
  • Introduction
  • Azure
    • AKS Basic
    • AKS Spark
    • AZ ACR SYNC
    • Azure CMI SDWAN
    • Azure LB DeepDive
      • Azure LB DeepDive
    • Azure Service Principal Basic
    • Azure Internal VM Network Connectivity
      • Azure Internal VM Network Connectivity
    • Azure Cli Build
    • Azure Vm Memory Monitor
  • Blockchain
    • BTC
  • CRISPR
    • 使用Parallel_Cluster提升CRISPA效率
  • OpenSource
    • ElasticSearch
      • ES Get Started
      • ES Search Query
      • Kibana 可视化
      • Logstash配置
    • Ansible 基础
    • Infra As Code
      • Pulumi Get Started
      • Terraform Basic
    • ZooKeeper 基础
    • RPC与REST
    • 使用Python申请大量内存测试
    • 使用TPC_DS产生压测数据
    • Superset
      • Superset部署手册
    • 代码扫描
    • Git
      • Git Basic
      • Github Action Basic
      • Gitlab与AzureAD集成
      • Gitbook 基础教程
    • K8S
      • enter_node
      • K8s X509 Client Cert
      • K8s Basic
      • K8s Oidc
      • Docker 基础
      • helm基础
      • K8S_Secrets管理
      • 深入了解K8S
      • 混沌工程
      • Istio
      • 生态
      • CRD开发
      • k8s网络
    • Cloud_Custodian
    • Jenkins Basic
    • Nginx
    • ETCD
    • 正则
    • VictoriaMetrics
    • Kafka
  • MySQL
    • MySQL 调优
  • Linux
    • SSH Tunnel 上网
    • 内存管理
    • 在Linux系统中通过LUKS加密磁盘
    • 量子计算 Basic
    • IO多路复用
    • Iptables
    • tmux和screen
    • Systemd
    • OS 基础
    • jq基础
    • yum
    • neovim
  • Web
    • Html Css
    • Web部署
    • 缓存
  • Programming
    • 算法
      • 返回list中最大生序子序列长度
    • Python技巧
      • Python的语法糖
      • Python常用装饰器
      • AsyncIO基础
      • 自动化测试pytest
      • python中的下划线
      • 面向对象
      • Python的坑
      • Python配置文件管理
      • HTTP Stream Response
      • Python项目管理
    • 设计模式
      • 设计模式
      • 面向对象的思想
      • 编程概念
    • Go
      • Go 基础
      • Go常用功能
      • 结构体入门
    • 前端
    • Vue
    • NodeJS
  • Math
    • 多项式插值法
  • Security
    • HTTP常见攻击
    • 加密与签名
    • RSA
    • ECDSA
  • Solidity
    • Solidity基础
    • Blockchain Testnet Faucet
  • Tools
    • 视频处理ffmpeg
    • IDE配置
    • iTerm2美化
    • 密码管理
    • FRP配置
    • 工具集
由 GitBook 提供支持
在本页
  • 面向对象的三大特性
  • 反射
  • 面向对象的 SOLID
  1. Programming
  2. 设计模式

面向对象的思想

面向对象的三大特性

  • 封装

  • 继承

  • 多态 (允许一个接口,调用不同的类或对象),有两种实现方式:比如可以用方法重载来实现,也可以用子类继承实现

    • 方法重载(overloading)实现多态:

      • 方法重载是指在同一类中定义多个具有相同名称但参数列表不同(参数的个数或类型)的方法。编译器会根据调用时所传递的参数类型自动选择合适的实现。例如,Python中的多态(基于鸭子类型):在这个例子中,Dog和Cat类都有一个speak方法。尽管它们属于不同的类,但可以使用相同的接口(函数make_sound)调用speak方法。这就是多态的体现。这个例子也是python对鸭子类型支持的一个很好的示例。

        class Dog:
            def speak(self):
                return "Woof!"
        
        class Cat:
            def speak(self):
                return "Meow!"
        
        def make_sound(animal):
            print(animal.speak())
        
        dog1 = Dog()
        cat1 = Cat()
        
        # 使用相同的接口调用不同的对象
        make_sound(dog1)  # 输出:Woof!
        make_sound(cat1)  # 输出:Meow!
        
    • 类的继承实现多态

      • 这个例子中,Dog 和 Cat都继承了 Animal类,并且重写了 make_sound 方法

      class Animal:
          def make_sound(self):
              pass
      
      class Dog(Animal):
          def make_sound(self):
              return "Woof"
      
      class Cat(Animal):
          def make_sound(self):
              return "Meow"
           
      
      animals = [Dog(), Cat()]
      for animal in animals:
          print(animal.make_sound())
      
    • 鸭子类型(duck typing)是一种在动态类型语言(例如Python)中实现多态的编程概念。这个概念的名字来自于著名的说法:“如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子。”在编程语境下,鸭子类型关注的是对象的行为(也就是它所具备的属性和方法),而非其确切的类型。

      在鸭子类型的编程风格中,开发者通常不会进行显式的类型检查。相反,他们依赖对象所表现出的行为特点。只要对象能够支持所需的操作,那么它就被视为具有相应的类型。换句话说,对象的类型由其所具备的方法和属性决定,而非其继承的类或实现的接口。

      在这个例子中,Dog和Cat类都具有一个名为speak的方法。虽然这两个类之间没有继承关系或共享接口,但它们都满足make_sound函数的要求——拥有一个可以被调用的speak方法。通过鸭子类型,我们可以用相同的接口(函数make_sound)来调用这两个类的Dog和Cat对象,实现多态。

      鸭子类型为编程带来了灵活性,但也有一定的风险——如程序在运行时才能发现类型错误。为了降低这种风险,开发者需要确保代码易于理解并且编写相应的单元测试。

    • 多数动态语言都支持鸭子类型,比如python,Ruby,JavaScript,PHP

反射

python 可以通过反射实现动态导包,默认的import xxx后面的xxx不能是string,但可以用 __import__("xxx")的方法来实现导入

面向对象的 SOLID

S: 单一职责原则:不要存在多个导致类变更的原因,通俗的讲,一个类只干一件事。 O (Open Close Principal): 开放封闭原则:一个软件实体如类,模块和函数,应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展

L:李氏替换原则: 所有使用父类的地方,必须能透明的使用其子类对象。(引用父类对象的时候,输入的参数和返回值,要和引用子类对象的参数和返回值一样)

I: 依赖倒置原则:高层模块(业务的直接实现)不应该依赖底层模块(为实现业务而定义的类),二者都应该依赖其抽象(抽象指的是接口),抽象不应该依赖细节,细节应该依赖抽象。换言之,要针对接口编程,而不是针对其实现编程

D:接口隔离原则:使用多个专门的接口,而不要使用单一的总接口,即类的实例化的对象,所调用的类应该只有其需要的方法。

上一页设计模式下一页编程概念

最后更新于1年前