前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用 classmethod 自定义创建对象的方式

用 classmethod 自定义创建对象的方式

作者头像
somenzz
发布于 2022-10-25 13:07:36
发布于 2022-10-25 13:07:36
31800
代码可运行
举报
文章被收录于专栏:Python七号Python七号
运行总次数:0
代码可运行

这里分享一下 classmethod 的实用小技巧。

classmethod 是一个非常实用的装饰器,可以用它来改变类创建对象的形为,比如说这样一段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Pet:
    def __init__(self, name):
        self.name = name

传入一个 name,初始化一个 Pet 对象,如果你觉得这太单调了,想实现非常个性的初始化方法,那么可以修改 __init__ 函数的代码。

但是,有些情况你不能修改 __init__ 函数的代码,比如代码已经运行很久了,有很多地方调用了 Pet 的 __init__ 方法,如果直接修改,可能会产生很多问题。

这时候就可以借助于装饰器 classmethod,自定义对象的创建方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import random

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

    @classmethod
    def create(cls):
        number = random.randint(100_000,999_999)
        return cls(f"Pet_{number}")

然后,可以这样调用,输出结果在注释里。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dog = Pet("Dog")
print(dog.name)
# Dog
pet = Pet.create()
print(pet.name)
# Pet_444383
print(isinstance(dog, Pet))
# True
print(isinstance(pet, Pet))
# True

此外,标准库里也有很多使用 classmethod 的例子,比如 dict.fromkeys 就是一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> dict.fromkeys("ABC", 0)
{'A': 0, 'B': 0, 'C': 0}
>>> dict.fromkeys(["hello","world"])
{'hello': None, 'world': None}

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python七号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PythonOOP面向对象编程1
车(类) -------> BYD E6 (京A.88888) 实例 ---------------> BMW X5 (xxxxxx) 实例
py3study
2020/01/16
3750
Python中三个装饰器函数用法(property、staticmethod、classmethod )
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量
Python学习者
2023/04/12
4310
python面向对象基础-01
面向对象: # 是一种编程思想,是前辈们总结的编程经验,指导程序员如何编写出更好的程序
suwanbin
2019/09/26
4750
python面向对象基础-01
Python面向对象基础
当把number属性变成私有属性__number之后,无法直接访问得到,只能通过get_number和set_number两个函数访问__number属性。
职场亮哥
2020/10/10
1.1K0
Python面向对象基础
Java开发者的Python快速进修指南:面向对象
当我深入学习了面向对象编程之后,我首先感受到的是代码编写的自由度大幅提升。不同于Java中严格的结构和约束,Python在面向对象的实现中展现出更加灵活和自由的特性。它使用了一些独特的关键字,如self和cls,这些不仅增强了代码的可读性,还提供了对类和实例的明确引用。正如Java,Python也依赖于对象和类的概念,允许我们通过定义类来创建和操作对象。尽管在表面上Python和Java在面向对象的实现上看似相似,但实际上,它们在细节处理上存在一些显著的差异。接下来,我们将探索这些差异,并深入了解它们在实际应用中的具体表现,以便更好地理解面向对象编程在不同语言中的独特风格和优势。
努力的小雨
2024/01/03
4590
详解 Python 方法之类方法 & 静态方法
这几天的阅读量蜜汁低,是什么原因我也没搞清楚,如果你们觉得我哪里写的有问题,或者是哪里不好,欢迎后台或者微信告知我,先行谢过。
编程文青李狗蛋
2019/11/07
1.7K0
史上最全 Python 面向对象编程
在多函数程序中,许多重要的数据被放置在全局数据区,这样它们可以被所有的函数访问。每个函数都可以具有它们自己的局部数据,将某些功能代码封装到函数中,日后便无需重复编写,仅调用函数即可。从代码的组织形式来看就是根据业务逻辑从上到下垒代码 。
马哥linux运维
2019/04/01
6200
史上最全 Python 面向对象编程
玩转Python属性和方法,成为高手不再难!
Python是一种简洁而强大的编程语言,其支持面向对象的编程范式。在Python中,属性和方法是面向对象编程的核心概念之一。本文将从入门到精通介绍Python中的属性和方法,帮助你深入了解这些重要的概念,并学会如何在实际开发中灵活应用它们。
子午Python
2023/07/30
3930
再再肝3天,整理了70个Python面向对象编程案例
Python 作为一门面向对象编程语言,常用的面向对象知识怎么能不清楚呢,今天就来分享一波
周萝卜
2021/11/24
7370
【Python】Python核心编程
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
用户7886150
2020/12/29
1.1K0
面向对象进阶
Wisdom is knowing what to do next , virtue is doing it .
GH
2019/12/16
4580
Python3 面向对象
类对象支持两种操作:属性引用和实例化。 属性引用语法:obj.name 对象创建后,类命名空间中所有的命名都是有效属性名
py3study
2020/01/03
5000
面向对象编程-类
面向对象编程OOP (object-oriented programming)是最有效的软件编写方法之一,面向对象是利用“类”和“对象”来创建各种模拟来实现对真实世界的描述,使用面向对象编程的原因一方面试因为它可以使程序的维护和扩展变得简单, 并且可以大大提高程序开发效率,面向对象的程序可以让人更加理解代码的逻辑。面向对象的核心特性之一:Class 类 一个类即是对一类拥有相同属性的对象的抽象,蓝图,原型。在类中定义了这些对象的都具备的属性,共同的方法。根据类来创建对象被称为实例化,这能够使用类的实例。 类
用户1679793
2018/04/28
9250
面向对象编程-类
day22-day28-面向对象
day22-day23初识面向对象,面向对象的小例子,组合的使用# 人和狗的战争class Dog: def __init__(self, name, aggr, hp, kind): # 定义一条狗的属性 self.name = name # 初始化属性 self.aggr = aggr self.hp = hp self.kind = kind def bite(self, person_obj): # 将人对象作为参数传入,即对
少年包青菜
2019/09/11
4110
Python基础之(八)类
当类中变量引用的是可变对象是,类属性和实例属性都能直接修改这个对象,从而影响另一方的值。
py3study
2020/01/03
3860
Python入门之面向对象编程(四)Python描述器详解
本文分为如下部分 引言——用@property批量使用的例子来引出描述器的功能 描述器的基本理论及简单实例 描述器的调用机制 描述器的细节 实例方法、静态方法和类方法的描述器原理 property装饰器的原理 描述器的应用 参考资料 引言 前面python面向对象的文章中我们讲到过,我们可以用@property装饰器将方法包装成属性,这样的属性,相比于其他属性有一个优点就是可以在对属性赋值时,进行变量检查,举例代码如下、 class A: def __init__(self, name, sco
Jetpropelledsnake21
2018/05/02
8880
Python学习(八)---- 面向对象类之进阶
原文地址: https://blog.csdn.net/fgf00/article/details/52479307 编辑:智能算法,欢迎关注! 上期我们一起学习了python中的类
智能算法
2018/10/08
4550
Python学习(八)---- 面向对象类之进阶
Python类方法、实例方法、静态方法和属性方法详解
1、用 @staticmethod 装饰的不带 self 参数的方法叫做静态方法,类的静态方法可以没有参数,可以直接使用类名调用
王大力测试进阶之路
2019/10/25
2.3K0
Python教程第6章 | Python面向对象
如果你学过 Java ,就知道 Java 的编程思想就是:万事万物皆对象。Python 也不例外,在解决实际问题的过程中,可以把构成问题事务分解成各个对象。
仲君Johnny
2024/01/24
2260
Python教程第6章 | Python面向对象
Python(五)
面向对象最重要的概念就是类(Class)和实例(Instance)。一个类(Class)能够创建一种新的类型(Type),其中对象(Object)就是类的实例(Instance)。可以这样来类比: 你可以拥有类型 int 的变量,也就是说存储整数的变量是 int 类的实例(对象)。 注意: Python 中,即使是整数也会被视为对象(int 类的对象),类似 C# 和 Java 中的装箱与拆箱。
1ess
2021/11/01
5750
相关推荐
PythonOOP面向对象编程1
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验