Python里的类和对象是什么?

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 本文介绍了Python中面向对象编程的核心概念——类与对象。类作为一种“蓝图”,定义了一组属性和方法,用于描述一类对象的共同特征与行为。通过类可以创建具体的对象实例,每个对象拥有类所定义的属性和方法。文章通过`Human`类的例子详细展示了如何定义类、初始化对象及其属性、定义方法,以及如何给对象添加自定义属性。此外,还介绍了如何通过类创建多个具有不同特性的对象实例,并探讨了属性覆盖和使用`@property`装饰器实现只读属性的方法。

学习 Python 到了一定阶段,我们就会接触到面向对象编程(OOP)。面向对象编程的核心概念之一就是“类”。本文将详细介绍 Python 中的类以及类与对象之间的关系。

类(Class)的概念

类可以看作是一种“蓝图”,它是一种将数据(属性)和操作这些数据的方法(函数)封装在一起的结构。就像建筑师使用蓝图来建造房屋一样,程序员使用类来创建对象。

例如,我们可以定义一个Human类,它有眼睛、耳朵、鼻子和嘴巴等属性。通过这个类,我们可以创建具体的人类对象,如oxxo,这个对象将具有类定义的所有属性。

ini

代码解读

复制代码

class Human:
    def __init__(self):
        self.eyes = 2  # 人类默认有两只眼睛
        self.ears = 2  # 人类默认有两只耳朵
        self.nose = 1  # 人类默认有一个鼻子
        self.mouth = 1  # 人类默认有一张嘴巴

oxxo = Human()  # 创建一个Human对象
print(oxxo.eyes)  # 输出2,打印oxxo的eye属性

对象(Object)的概念

在 Python 中,一切都是对象,包括数字、字符串、函数等。对象是类的实例,只是 Python 默认隐藏了大部分对象的底层机制,仅展示最常用的接口。对象是一种自定义的数据结构,可以包含变量、属性、函数或方法。一个对象可通过其属性或方法来定义与外部的交互方式。

创建类

创建类的方式类似于创建一个函数,差别在于函数使用 def 开头,而类使用 class 开头,下面的代码会创建一个“空”的类 Human(很像一个人在最开始只是一个细胞,身上什么器官都还没长出来):

python

代码解读

复制代码

class Human():
    pass        # 使用 pass 可以创建一个空类

接着使用创建类的默认方法__init__(注意前后是两条底线),将默认的属性加入到类里。

  • __init__默认带有self一个参数,代表通过类创建的对象本体,使用.属性就能将指定的属性加入类中。
  • __init__可以不用写,但如果需要有一些默认的属性,就可以定义在里面。
  • __init__是类的一个特殊方法,每当创建类的新实例时都会自动调用它。

ruby

代码解读

复制代码

class Human():
    def __init__(self):  # 创建默认属性的写法
        self.eye = 2       # 两个眼睛
        self.ear = 2       # 两个耳朵
        self.nose = 1      # 一个鼻子
        self.mouth = 1     # 一张嘴巴

除了默认的属性,也可以从外部定义自定义属性,下面的代码额外定义了 hand 和 leg 两个属性。

ini

代码解读

复制代码

class Human():
    def __init__(self):
        self.eye = 2
        self.ear = 2
        self.nose = 1
        self.mouth = 1

Human.hand = 2  # 定义hand属性
Human.leg = 2    # 定义leg属性

oxxo = Human()
print(oxxo.hand) # 2
print(oxxo.leg)   # 2

除了定义属性,也可以给类定义方法,下面的例子给 Human 类定义了 say 和 play 两个方法。

注意,类方法的第一个参数必须是 self。

ruby

代码解读

复制代码

class Human():
    def init(self):
        self.eye = 2
        self.ear = 2
        self.nose = 1
        self.mouth = 1
    def say(self, msg):
        print(msg)
    def play(self, thing):
        print(thing)


oxxo = Human()
oxxo.say('hello') # hello
oxxo.play('baseball') # baseball

刚刚有提到self这个参数,这个参数代表“通过类建立的对象本体”,使用self可以读取到这个对象的所有属性,下面的例子从外部定义了 oxxo.name 的属性,在 Human 里就能使用self.name取得这个属性。

python

代码解读

复制代码

class Human:
    def __init__(self):
        self.eyes = 2
        self.ears = 2
        self.nose = 1
        self.mouth = 1

    def say(self, message):
        print(f"{self.name} says: {message}")

    def play(self, activity):
        print(f"{self.name} is playing {activity}")

# 创建对象并添加自定义属性
oxxo = Human()
oxxo.name = "Oxxo"
oxxo.age = 30

oxxo.say("Hello, world!")  # 输出:Oxxo says: Hello, world!
print(oxxo.age)  # 输出:30

多个对象同一个类

一个类可以产生多个对象(Human 的类可以产生无数不同的人),每个对象产生后,也可以定义自己特殊的属性,就如同人出生后,虽然都有眼睛鼻子嘴巴,但某些人会去学画画,某些人会去学钢琴,下面的代码会产生 oxxo 和 gkpen 两个不同的人,oxxo 会自定义 age 属性,gkpen 会自定义 weight 属性。

ini

代码解读

复制代码

class Human():
    def init(self):
        self.eye = 2
        self.ear = 2
        self.nose = 1
        self.mouth = 1
    def say(self, msg):
        print(f'{self.name} say: {msg}')
    def play(self, thing):
        print(thing)

oxxo = Human()        # 定义 oxxo
gkpen = Human()       # 定义 gkpen
oxxo.name = 'oxxo'    # oxxo 的名字叫做 oxxo
oxxo.age = 18         # oxxo 的 age 为 18

gkpen.name = 'gkpen'  # gkpen 的名字叫做 gkpen
gkpen.weight = 70     # gkpen 的 weight 为 70

oxxo.say('hello')    # oxxo say: hello
print(oxxo.age)      # 18
gkpen.say('song')    # gkpen say: song
print(gkpen.weight)  # 70

如果觉得这样子定义比较麻烦,也可以在建立类时,预先设置好一些参数,接着通过类建立对象时,再做动态的调整,例如下面的例子,在__init__里建立 age、weight 的参数,建立对象时就能动态传入。

python

代码解读

复制代码

class Human():
    def __init__(self, age, weight):  # 新增age和weight参数
        self.eye = 2
        self.ear = 2
        self.nose = 1
        self.mouth = 1
        self.age = age            # 读取参数,变成属性
        self.weight = weight      # 读取参数,变成属性

    def say(self, msg):
        print(f'{self.name} say: {msg}')

    def play(self, thing):
        print(thing)

oxxo = Human(18, 68)  # 建立对象时,设定参数数值
gkpen = Human(15, 70)  # 建立对象时,设定参数数值
print(oxxo.age, oxxo.weight)  # 18, 68
print(gkpen.age, gkpen.weight) # 15, 70

覆盖属性

如果从外部定义了和类属性名称相同的属性,就会覆盖内部属性,下面的例子,从外部定义了 oxxo.mouth 的属性,就覆盖原本的 mouth 属性。

python

代码解读

复制代码

class Human():
    def init(self):
        self.eye = 2
        self.ear = 2
        self.nose = 1
        self.mouth = 1
    def say(self, msg):
        print(f'{self.name} say: {msg}')
    def play(self, thing):
        print(thing)

oxxo = Human()
oxxo.mouth = 5  # 覆写 play 属性
print(oxxo.mouth)   # 5

@property 只读属性

如果在类里有些属性不希望被外部更动,就能使用@property 的装饰器,将该属性设为只读属性,下面的例子,oxxo.a 可以将原本的 a 属性换成 12345,但 oxxo.b 就无法更动 b 属性,因为 b 属性已经变成只读属性。

python

代码解读

复制代码

class A():
    def a(self):
        return 'aaaaa'

    @property
    def b(self):
        return 'bbbbb'

oxxo = A()
oxxo.a = '12345'
print(oxxo.a)  # 12345
oxxo.b = '12345'  # 发生错误 can't set attribute
print(oxxo.b)  # 12345


转载来源:https://juejin.cn/post/7372456890343424015

相关文章
|
5月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
185 4
|
5月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
6月前
|
安全 JavaScript Java
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
本文通过10个真实场景,深入解析Python中表示“空值”的None与NoneType。从单例模式、函数返回值,到类型注解、性能优化,全面揭示None在语言设计与实际编程中的核心作用,帮助开发者正确高效地处理“无值”状态,写出更健壮、清晰的Python代码。
630 3
|
6月前
|
Python
解决Python中AttributeError:'image'对象缺少属性'read_file'的问题策略。
通过上述策略综合考虑,您将能够定位问题并确定如何解决它。记住,Python社区很庞大,也很乐于帮助解决问题,因此不要害怕在求助时提供尽可能多的上下文和您已经尝试过的解决方案。
179 0
|
10月前
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
492 15
|
10月前
|
安全 测试技术 开发者
Python中的“空”:对象的判断与比较
在Python开发中,判断对象是否为“空”是常见操作,但其中暗藏诸多细节与误区。本文系统梳理了Python中“空”的判定逻辑,涵盖None类型、空容器、零值及自定义对象的“假值”状态,并对比不同判定方法的适用场景与性能。通过解析常见误区(如混用`==`和`is`、误判合法值等)及进阶技巧(类型安全检查、自定义对象逻辑、抽象基类兼容性等),帮助开发者准确区分各类“空”值,避免逻辑错误,同时优化代码性能与健壮性。掌握这些内容,能让开发者更深刻理解Python的对象模型与业务语义交集,从而选择最适合的判定策略。
392 5
|
10月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
250 11
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
628 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
11月前
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
263 1
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
289 2

推荐镜像

更多