Python 对象表现得像函数

news/2024/12/21 19:00:51/

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.ppmy.cn/news/1210007.html

相关文章

设备零部件更换ar远程指导系统加强培训效果

随着科技的发展,AR技术已经成为了一种广泛应用的新型技术。AR远程指导系统作为AR技术的一种应用,具有非常广泛的应用前景。 一、应用场景 气象监测AR教学软件适用于多个领域,包括气象、环境、地理等。在教学过程中,软件可以帮助学…

NZ系列工具NZ06:VBA创建PDF文件说明

我的教程一共九套及VBA汉英手册一部,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到数据库,到字典,到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑,这么多知识点该如何组织…

基于STM32设计的智能水母投喂器(华为云IOT)

基于STM32设计的智能水母养殖系统 一、设计简述 1.1 项目背景 水母是一种非常美丽和神秘的生物,在许多人的眼中,它不仅是一种宽广的海洋世界中的一道美丽的风景线,同时也是一种珍贵的实验动物和养殖资源。随着水母的养殖需求不断增多,一个高效、智能、可控的水母养殖系统…

区块链探秘:从基础到深度,全面解读区块链技术与应用

1.区块链基本概念 1.发展历史 比特币诞生: 2008年,化名为中本聪的人发表了论文《Bitcoin:A Peer-to-Peer Electronic Cash System》 2009年1月3日,中本聪开发运行了比特币客户端程序并进行了首次挖矿,获得了第一批…

HTB——常见端口及协议总结

文章目录 一、 常见端口二、HTTP协议三、FTP四、SMB 一、 常见端口 http协议:80、8000https协议:443、8443ftp协议:20(数据传输)、21(发送命令)smb协议:445 二、HTTP协议 https的…

n-gram语言模型——句子概率分布计算与平滑

n-gram语言模型——句子概率分布计算与平滑 前言 语言模型 等价假设 n元语法 句子概率分布计算方式 数据平滑 Lidstone平滑(1-gram) Laplace平滑(1-gram) 附上两种平滑在1-gram下代码 Lidstone平滑与Laplace平滑(2-gram) 附上两种平滑在2-gram下代码 前言 语言模型…

使用Pytorch的一些小细节(一)

文章目录 前言数据结构-张量max函数索引函数赋值函数拼接函数 前言 由于不经常动手写代码,所以对于python语言中的常见数据结构的用法也不是很熟悉,对于pytorch中的数据结构就更加不熟悉了。之前的代码基础是基于C语言的,属性都是自己定义&a…

进阶课6——基于Seq2Seq的开放域生成型聊天机器人的设计和开发流程

情感聊天机器人通常属于开放领域,用户可以与机器人进行各种话题的互动。例如,微软小冰和早期的AnswerBus就是这种类型的聊天机器人。基于检索的开放领域聊天机器人需要大量的语料数据,其开发流程与基于任务型的聊天机器人相似,而基…