Python开发 —— 对象type、object、class

news2024/9/23 3:24:57

1. "Python中一切皆为对象"的理解

        在Python中,一切皆为对象的意思是指:无论是数字、字符串、函数、类、模块等任何数据类型,都可以被看做是一个对象。每个对象都具有自己的属性和方法,可以被操作和调用。

        例如,我们可以将整数赋值给变量,并使用变量进行计算:

x = 10
y = 20
z = x + y
print(z)

        在这个例子中,10和20都是整数对象,它们被赋值给了变量x和y。当我们执行x + y时,Python实际上调用了整数对象的__add__方法,计算出了它们的和,并将结果赋值给变量z。

        同样的,我们也可以使用字符串对象的方法来进行字符串操作:

s = "hello"
print(s.upper())

        这里,我们定义了一个字符串对象s,并调用了它的upper()方法,将字符串转换为大写字母输出。

        总之,在Python中,一切皆为对象的概念意味着我们可以将各种数据类型视为对象,并对它们进行操作和调用其方法。

2. 对象的两种关系

        在Python中,对象之间的关系主要有两种:继承关系(Inheritance)和 组合关系(Composition)。这两种关系分别代表了对象之间的不同关联方式。

2.1 继承关系(Inheritance)

        继承关系是面向对象编程的一种基本特性,它允许一个类(子类)从另一个类(父类)继承属性和方法。通过继承,可以复用父类的代码,并且可以对其进行扩展或修改。

        示例:

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        raise NotImplementedError("Subclass must implement abstract method")

class Dog(Animal):
    def speak(self):
        return f"{self.name} says Woof!"

class Cat(Animal):
    def speak(self):
        return f"{self.name} says Meow!"

# 使用示例
dog = Dog("Buddy")
cat = Cat("Whiskers")
print(dog.speak())  # 输出:Buddy says Woof!
print(cat.speak())  # 输出:Whiskers says Meow!

        在这个例子中,Dog 和 Cat 类继承自 `Animal` 类。它们继承了 Animal 类的构造函数,并且重写了 spea` 方法。

2.2 组合关系(Composition)

        组合关系是指一个类中包含另一个类的实例。通过组合,可以将现有的类组合成更复杂的对象。组合是一种“有一个”的关系,而继承是一种“是一个”的关系。

        示例:

class Engine:
    def __init__(self, horsepower):
        self.horsepower = horsepower

    def start(self):
        return "Engine started"

class Car:
    def __init__(self, model, engine):
        self.model = model
        self.engine = engine

    def start(self):
        return f"{self.model} with {self.engine.horsepower} HP engine: {self.engine.start()}"

# 使用示例
engine = Engine(150)
car = Car("Toyota", engine)
print(car.start())  # 输出:Toyota with 150 HP engine: Engine started

        在这个例子中,`Car` 类包含了一个 `Engine` 类的实例。这展示了组合关系,其中 `Car` 通过包含 `Engine` 的实例来实现其功能。

2.3 总结

        继承:用于描述一种“是一个”(is-a)的关系,子类从父类继承属性和方法,子类可以重写或扩展父类的行为。
        组合:用于描述一种“有一个”(has-a)的关系,一个类包含另一个类的实例,组合使得类可以通过组合其他类的实例来实现复杂功能。

        这两种关系在设计类结构时非常重要,选择使用继承还是组合取决于具体的需求和对象之间的逻辑关系。

3. 如何确定对象的类型?

        有两个内置函数可以帮助你识别对象的类型。如果需要对象的确切类型,可以使用 type();如果要检查对象的类型,可以使用 isinstance()。通常情况下,你会希望使用 isinstance(),因为它非常健壮,而且还支持类型继承。

3.1 type() 函数

        要获取对象的实际类型,可以使用内置的 type() 函数。将对象作为唯一参数传递,将返回该对象的类型对象:

>>> type([]) is list
True
>>> type({}) is dict
True
>>> type('') is str
True
>>> type(0) is int
True

        当然,这也适用于自定义类型:

>>> class Test1 (object):
        pass
>>> class Test2 (Test1):
        pass
>>> a = Test1()
>>> b = Test2()
>>> type(a) is Test1
True
>>> type(b) is Test2
True

        请注意,type() 只返回对象的直接类型,而不能告诉你类型继承的情况。

>>> type(b) is Test1
False

3.2 isinstance 函数

        为此,您应该使用 isinstance 函数。当然,这也适用于内置类型:

>>> isinstance(b, Test1)
True
>>> isinstance(b, Test2)
True
>>> isinstance(a, Test1)
True
>>> isinstance(a, Test2)
False
>>> isinstance([], list)
True
>>> isinstance({}, dict)
True

        isinstance() 通常是确保对象类型的首选方法,因为它也接受派生类型。因此,除非您确实需要类型对象(无论出于什么原因),否则最好使用 isinstance() 而不是 type()。

        isinstance() 的第二个参数也接受一个类型元组,因此可以同时检查多个类型:

>>> isinstance([], (tuple, list, set))
True

4. type、object、class

        在Python中,type、object 和 class 之间存在一种复杂而有趣的关系。它们是Python面向对象编程核心的组成部分。以下是它们之间关系的详细解释:

4.1 object

        object 是Python中所有类的基类,所有的类默认都继承自 object。这意味着每个类的实例在Python中最终都是 object 的实例。

        示例:

class MyClass:
    pass

my_instance = MyClass()
print(isinstance(my_instance, object))  # 输出:True

        在这个例子中,MyClass 是一个用户定义的类,它隐式地继承自 object,所以 my_instance 是 object 的实例。

4.2 type

        type 是一个元类(metaclass),用于创建类和定义类的行为。在Python中,类也是对象,type 是这些对象的类。换句话说,type 是所有类的类。使用 type 可以动态地创建类。

        示例:

class MyClass:
    pass

print(type(MyClass))  # 输出:<class 'type'>

        在这个例子中,MyClass 是一个类,type(MyClass) 的结果表明 `MyClass` 本身是 `type` 的一个实例。

4.3 class

        class 是Python中的一种结构,用于定义对象的蓝图。类定义了对象的属性和方法。类本身是由 type 创建的实例,而实例是由类创建的。

        示例:

class MyClass:
    def __init__(self, value):
        self.value = value

    def get_value(self):
        return self.value

my_instance = MyClass(10)
print(my_instance.get_value())  # 输出:10```

        在这个例子中,MyClass 是一个类,my_instance 是 `MyClass` 的实例。

4.4 关系

        1.所有类都是 type 的实例:这包括用户定义的类和内建的类。`type` 是所有类的元类。

print(type(MyClass))  # 输出:<class 'type'>
print(type(int))  # 输出:<class 'type'>

        2. 所有类都继承自 object:这是因为 object 是所有类的基类。

print(issubclass(MyClass, object))  # 输出:True
print(issubclass(int, object))  # 输出:True

        3. type 本身也是一个类,它是 type 的实例:这是Python中的一个递归特性,说明 `type` 是自我描述的。

print(type(type))  # 输出:<class 'type'>

        4. 所有对象都是类的实例,而所有类最终都是 `object` 的实例:

4.5 详细解释

        在Python中,`object`、`type`和类(class)之间存在一种特殊而紧密的关系:

        1. `object`是所有对象的基类:所有对象(包括实例和类)最终都是`object`的实例。
        2. `type`是所有类的元类:所有的类(包括内置类型和用户定义的类)都是`type`的实例,这意味着类是由`type`创建和管理的。
        3. 类是由`type`创建并继承自`object`:这意味着所有类本身也是`object`的实例,同时它们又是`type`的实例。

        特别之处在于:
        object是type的实例:因为object作为一个类,它是由type创建的。
        type是object的实例:因为type也是一个对象,它继承自object。

        这种互为实例的关系形成了一个闭环,打破了传统的继承树结构,但确保了Python中所有对象和类型的统一处理,提供了强大的灵活性和一致性。这种设计使得Python能够以一致的方式处理所有对象和类,构建了一个灵活且强大的类型系统。

4.6 关系图表

        这三者构成了Python面向对象编程的基础,理解它们之间的关系有助于更深入地理解Python的类型系统和对象模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1706802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IP地址SSL证书应用场景以及如何申请?

一&#xff1a;IP地址SSL证书主要应用于以下几种场景&#xff1a; 1.API接口保护&#xff1a;许多云服务和企业内部系统使用IP地址直接作为服务的访问点&#xff0c;特别是在API接口的调用中。IP地址SSL证书可以为这些API接口提供必要的安全加密&#xff0c;确保数据在传输过程…

DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion

UW&UCB&Google&NVIDIA ICCV23https://github.com/johannakarras/DreamPose?tabreadme-ov-file 问题引入 输入参考图片 x 0 x_0 x0​和pose序列 { p 1 , ⋯ , p N } \{p_1,\cdots,p_N\} {p1​,⋯,pN​}&#xff0c;输出对应视频 { x 1 ′ , ⋯ , x N ′ } \{x_1,…

停车场变综合楼,结构分析助力低碳设计

PLAXIS 和 RAM 助力确定更有效的结构设计并大幅降低施工成本 总部和周边区域 桑坦德银行位于英国的新总部将现有的四个英国办事处合并到米尔顿凯恩斯的一个中心枢纽&#xff0c;位于伦敦以北 50 英里。 Unity Place 将作为桑坦德银行约 5,000 名员工的办公场所。该项目总投资 …

AIGC笔记--基于PEFT库使用LoRA

1--相关讲解 LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS LoRA 在 Stable Diffusion 中的三种应用&#xff1a;原理讲解与代码示例 PEFT-LoRA 2--基本原理 固定原始层&#xff0c;通过添加和训练两个低秩矩阵&#xff0c;达到微调模型的效果&#xff1b; 3--简单代…

web自动化-下拉框操作/键鼠操作/文件上传

在我们做UI自动化测试的时候&#xff0c;会有一些元素需要特殊操作&#xff0c;比如下拉框操作/键鼠操作/文件上传。 下拉框操作 在我们很多页面里有下拉框的选择&#xff0c;这种元素怎么定位呢&#xff1f;下拉框分为两种类型&#xff1a;我们分别针对这两种元素进行定位和…

答应我!养猫就一定要入手的七款好物!养猫真的会开心

养猫是一件让人愉悦的事情&#xff0c;猫咪的陪伴能让我们感到温暖和满足。然而&#xff0c;想要让猫咪健康快乐地成长&#xff0c;除了关心它们的饮食和健康&#xff0c;还需要为它们准备一些必要的生活用品。今天&#xff0c;我将为大家推荐几个养猫必备的好物&#xff0c;让…

黑马头条day6总结

1、wemedian错误 一开始没加EnableFeignClients(basePackages "com.heima.apis")导致获取ischeduleClient错误&#xff0c;找不到bean。 我看教程的代码中没有&#xff0c;【ComponentScan({"com.heima.apis","com.heima.wemedia"})】&#x…

11款必备IP地址管理软件,你都用过吗?

1、LightMesh IPAM 产品描述&#xff1a;LightMesh IPAM 是一款功能强大的工具&#xff0c;可简化和自动化互联网协议网络的管理。它提供可扩展性、子网规划器、即时云发现、IP 和网络管理以及 IP 规划和可视化&#xff0c;以帮助您优化效率、可见性和安全性。 特征&#xff1…

强化学习——学习笔记

一、什么是强化学习&#xff1f; 强化学习 (Reinforcement Learning, RL) 是一种通过与环境交互来学习决策策略的机器学习方法。它的核心思想是让智能体 (Agent) 在执行动作 (Action)、观察环境 (Environment) 反馈的状态 (State) 和奖励 (Reward) 的过程中&#xff0c;学习到…

C++音视频开发面试题集锦

老规矩&#xff0c;先上面试题目&#xff1a; 1、iOS 中系统 API 提供了哪些视频编码的方式&#xff1f;2、VideoToolbox 视频帧解码失败以后应该如何重试&#xff1f;3、如何使用 PSNR 对视频转码质量进行评估&#xff1f;4、什么是 VAO&#xff0c;什么是 VBO&#xff0c;它…

【图书推荐】《机器学习实战(视频教学版)》

本书用处 快速入门Python机器学习基础算法。 最后3个综合实战项目&#xff08;包括新闻内容分类实战、泰坦尼克号获救预测实战、中药数据分析项目实战&#xff09;可以作为研究可以的素材。 内容简介 本书基于Python语言详细讲解机器学习算法及其应用&#xff0c;用于读者快…

Java 五种内部类演示及底层原理详解

内部类 什么是内部类 在A类的内部定义B类&#xff0c;B类就被称为内部类 发动机类单独存在没有意义 发动机为独立个体 可以在外部其他类里创建内部类的对象去调用方法 类的五大成员 属性 方法 构造方法 代码块 内部类 内部类的访问特点 内部类可以直接访问外部类的成员&a…

Java处理CSV文件示例

Java处理CSV文件示例 1. 导入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-csv</artifactId><version>1.10.0</version></dependency>文件示例 下面是示例文件文件数据 vscode和idea都有解析…

第二证券股市资讯:连续3天20%涨停!A股这一赛道,牛股批量出现!

今日&#xff0c;A股小幅轰动调整&#xff0c;上证指数下试3100点支撑。 两市成交7453亿元&#xff0c;创近4个月来新低&#xff0c;超4000只个股下跌。盘面上&#xff0c;电力、芯片、煤炭、石油等板块涨幅居前&#xff0c;铜缆高速衔接、房地产、工程机械、网络游戏等板块跌幅…

word-主控文档、文档拆分及标书编写技巧建议

一、主控文档 视图-大纲视图-显示文档-插入子文档 子文档一旦更新&#xff0c;主文档也会更新。更新主文档&#xff0c;子文档也会更新 需要注意&#xff0c;不可修改子文档名字 二、上交文件 显示文档-折叠子文档-只显示一级-取消链接-关闭大纲视图-保存 三、文档拆分 根…

Transformer 从attention到grouped query attention (GQA)

Attention原理和理解 attention原理参考&#xff1a; Attention Is All You Need The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time. Transformer图解 - 李理的博客 Attention首先对输入x张量乘以WQ, WK, WV得到query,…

本地开发正常 线上CI/CD构建项目过程报错文件未能正确引用

问题快照 原因分析&#xff1a; 一般遇到这样的错误就是 文件路径或者文件名称未能正确匹配 或者文件不存在 会报这样的错误 以为很好解决 但这次 都排查 了 就是 没发现原因 不管怎么说还是要感谢 GPT的能力(分析问题的能力) 先上图 当我看到 第四步的时候 我立马 去仓库里查…

没开玩笑!高速信号不能参考电源网络这条规则,其实很难做到

高速先生成员--黄刚 看到这篇文章的题目&#xff0c;我相信大家心里都呈现出了这么一个场景&#xff1a;高速信号线在L20层&#xff0c;我只要把L19和L21层都铺上完整的地平面&#xff0c;这不就满足了高速信号线不能参考电源平面这条规则了吗&#xff1f;这难道很难做到吗&…

Windows 使用技巧

Windows 使用技巧 ①局域网内共享文件 ②CTRL Y 和 CTRL Z ①局域网内共享文件 第一步&#xff1a; 选择要共享的文件&#xff08;分享方操作&#xff09; 第二步&#xff1a; 右键打开属性&#xff0c;选择共享&#xff08;分享方操作&#xff09; 第三步&#xff1a; …

Spring使用的设计模式

Spring 框架是一个广泛使用的 Java 框架&#xff0c;它内部使用了多种设计模式来简化开发过程、提高代码的可维护性和扩展性。 以下是一些在 Spring 框架中常见的设计模式&#xff0c;以及用代码示例来解释它们&#xff1a; 一、工厂模式&#xff08;Factory Pattern&#xff…