Python 对象表现得像函数

Python 对象表现得像函数

flyfish

面向对象编程里有句话一切皆对象。everything is an object,python里就是这样

module 是 object

import math
my_math = math
my_math.a=1 #为module object新增一个名为a的属性
print(my_math.a)

class 是 object

class Person:unknown_age = "unknown_age"def __init__(self, name, age=None):self.name = nameself.age = ageprint("__init__ call")def show_age(self):if self.age is None:print("show_age:unknown_age")return self.unknown_ageprint("show_age:",self.age)return self.age#通常的写法
xiaoming = Person("xiaoming")
xiaoming.show_age()# class 是 object
my_class = Person
xiaoming = my_class("xiaoming",10)
xiaoming.show_age()

结果

# __init__ call
# show_age:unknown_age
# __init__ call
# show_age: 10

class是 object
instance of classes是object
module 是object
function 是object
也就是
everything is an object.

对象表现得像函数

在python里函数是first-class object 一等对象
first-class object 与first-class citizen(一等公民), first-class value 同样的意思
根据
一等荣誉学位(First Class Honours
二等一级荣誉学位(Upper Second Class Honours) 及格线在此
三等荣誉学位(Third Class Honours)

first-class object 是好的,是个褒义词,second-class object就是次好的。

按照wiki的解释
An object is first-class when it:

can be stored in variables and data structures
can be passed as a parameter to a subroutine
can be returned as the result of a subroutine
can be constructed at runtime
has intrinsic identity (independent of any given name)

Depending on the language, this can imply:

being expressible as an anonymous literal value
being storable in variables
being storable in data structures
having an intrinsic identity (independent of any given name)
being comparable for equality with other entities
being passable as a parameter to a procedure/function
being returnable as the result of a procedure/function
being constructible at runtime
being printable
being readable
being transmissible among distributed processes
being storable outside running processes

对象表现得像函数,只需要实现实例方法__call__

也就是在类型定义了__call__方法,那么它的实例可以作为函数调用。

可以对比下 对象.方法 的方式调用

class Person:def __init__(self, age):self.age = agedef now_age(self,age):self.age = ageprint("now age:", self.age)p = Person('10')
p.now_age(11)

像函数那样调用

class Person(object):def __init__(self, name, age):self.name = nameself.age = ageprint(self.name)print(self.age)def __call__(self, age):self.age = ageprint("now age:", self.age)p = Person('xiaoming', '10')
p('11') 

输出

xiaoming
10
now age: 11

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

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

相关文章

【ES专题】ElasticSearch功能详解与原理剖析

目录 前言要点阅读对象阅读导航前置知识笔记正文一、ES数据预处理1.1 Ingest Node:摄入节点1.2 Ingest Pipeline:摄入管道1.3 Processor:预处理器——简单加工1.4 Painless Script:脚本——复杂加工1.5 简单实用案例 二、文档/数据…

springcloud二手交易平台系统源码

开发技术: 大等于jdk1.8,大于mysql5.5,idea(eclipse),nodejs,vscode(webstorm) springcloud springboot mybatis vue elementui mysql 功能介绍: 用户端&…

时间序列预测模型实战案例(十)(个人创新模型)通过堆叠CNN、GRU、LSTM实现多元预测和单元预测

本文介绍 本篇博客为大家讲解的是通过组堆叠CNN、GRU、LSTM个数,建立多元预测和单元预测的时间序列预测模型,其效果要比单用GRU、LSTM效果好的多,其结合了CNN的特征提取功能、GRU和LSTM用于处理数据中的时间依赖关系的功能。通过将它们组合在…

Java根据一个List内Object的两个字段去重

背景 在Java开发过程中,我们经常会遇到需要对List进行去重的需求。 其中常见的情况是,将数组去重,或者将对象依据某个字段去重。这两种方式均可用set属性进行处理。 今天讨论,有一个List,且其中的元素是自定义的对象&…

【VUE+ elementUI 实现动态表头渲染】

VUE elementUI 实现动态表头渲染 1、定义 columns(表头数据) 和 dataList(表格数据) data() {return {loading: false,dataList: [{ name: 张三, sex: 男, age: 18 },{ name: 林琳, sex: 女, age: 20 },{ name: 王五, sex: 男, …

8 STM32标准库函数 之 实时时钟(RTC)所有函数的介绍及使用

8 STM32标准库函数 之 实时时钟(RTC)所有函数的介绍及使用 1. 图片有格式2 文字无格式二、RTC库函数固件库函数预览2.1 函数RTC_ITConfig2.2 函数RTC_EnterConfigMode2.3 函数RTC_ExitConfigMode2.4 函数RTC_GetCounter.2.5 函数RTC_SetCounter2.6 函数RTC_SetPrescaler2.7 函…

数据分析-numpy

numpy numpy numpy简介优点下载ndarray的属性输出数据类型routines 函数ndarray对象的读写操作ndarray的级联和切分级联切分 ndarray的基本运算广播机制(Broadcast)ndarry的聚合操作数组元素的操作numpy 数学函数numpy 查找和排序 写在最后面 简介 nump…

TDengine数据迁移之数据对比

数据完整性和一致性校验是迁移数据后的必要步骤,TDengine 数据迁移也是如此。但通常TDengine存储的都是海量数据,动辄几百亿条数据,如果像手工对比差异,工作量是非常巨大的。 以下脚本实现了对两个数据库记录数的对比。主要实现方…

前端设计模式之【访问者模式】

文章目录 前言介绍实现优缺点应用场景后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端设计模式 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&#…

ChatGPT:something went wrong

今天下午不知什么原因,ChatGPT无法使用。我原来在使用ChatGPT for chrome,返回了一个答案,后来在网页端无法使用,以为是这个chrome插件泄露API KEY导致的。注销账号,删除API KEY后,wrong问题仍然存在。 我…

oj刷题-C语言版

1. A B 题目 输入两个整数,求这两个整数的和是多少。 输入格式 输入两个整数A,B ,用空格隔开 输出格式 输出一个整数,表示这两个数的和 数据范围 0≤A,B≤108 样例输入: 3 4 样例输出: 7AC代码C: #…

API是什么?解密API背后的奥秘

API,全称Application Programming Interface,是一种用于不同应用程序间通信的接口,它允许不同的应用程序之间交换数据和功能。API可以理解为应用程序提供给其他应用程序或开发者的接口,通过这个接口,其他应用程序或开发…

2023年CCF非专业级别软件能力认证第二轮 (CSP-J)入门级C++语言试题

2023年CCF非专业级别软件能力认证第二轮 (CSP-J)入门级C语言试题 编程题第 1 题 问答题 小苹果(apple) 题目描述 小Y的桌子上放着n个苹果从左到右排成一列,编号为从1到n。 小苞是小Y的好朋友,每天她都会…

PostgreSQL 技术内幕(十一)位图扫描

扫描算子在上层计算和底层存储之间,向下扫描底层存储的数据,向上作为计算的输入源,在SQL的执行层中,起着关键的作用。顺序、索引、位图等不同类型的扫描算子适配不同的数据分布场景。然而,扫描算子背后的实现原理是怎样…

flink测试map转换函数和process函数

背景 在flink中,我们需要对我们写的map转换函数,process处理函数进行单元测试,测试的内容包括查看函数的输出结果是否符合以及函数内的状态是否正确更新,本文就记录几个测试过程中的要点 flink中测试函数 首先我们根据我们要测…

RSA加密的使用(前后端)

公钥(publicKey)加密、私钥(privateKey)解密。不能逆向,私钥(privateKey)加密、公钥(publicKey)解密。说白了就是前后端都需要用公钥(publicKey)进…

【JavaEESpring】认识Spring

认识Spring 1. 什么是框架2. SpringBoot 介绍2.1 Spring 的介绍2.2 SpringBoot 1. 什么是框架 框架(Framework) ,意思是框架、机制、准则。通俗的来讲: 框架是实现某种功能的半成品, 他提供了⼀些常⽤的⼯具类, 我们在框架的基础上, 可以更加⾼效的进⾏开发 后端框…

Redis6的IO多线程分析

性能测试 机器配置 C Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 14 On-line CPU(s) list: 0-13 Mem: 62G性能 配置推荐 官方表示,当使用redis时有性能瓶…

vue3接口、数据懒加载,回滚不重复加载

目标:实现当组件进入可视区域在加载数据或者发送请求。 背景:父组件为vxe-table构成的组件、子组件为table的某一列,这一列的数据通过接口返回,有多少条表格数据就会请求多少次接口,为了提升性能,所以采用…

《开箱元宇宙》:认识香港麦当劳通过 The Sandbox McNuggets Land 的 Web3 成功经验

McNuggets Land 是 The Sandbox 于 2023 年发布的最受欢迎的体验之一。在本期的《开箱元宇宙》系列中,我们采访了香港麦当劳数位顾客体验暨合作伙伴资深总监 Kai Tsang,来了解这一成功案例背后的策略。 在不断发展的市场营销和品牌推广领域,不…