1、函数和类是对象,是Python中的一级公民

(1)将函数和类赋值给一个变量

将函数或类赋值给一个变量,就可以把该变量当成函数或类来使用

 def ask(name):
print(name)
class Person:
def __init__(self):
print("hello bobby")
print("-----函数赋值给变量-------")
my_func = ask
# 变量当成函数使用
my_func("bobby")
print("---------类赋值给变量-----")
my_class = Person
# 变量当成类使用
# 类实例化即会调用初始化函数
my_class()

(2)可以将对象(函数和类)添加到集合对象中

def ask(name="bobby"):
print(name)
class Person:
def __init__(self):
print("hello bobby")
print("-----函数和类可以添加到集合对象中去---")
obj_list = []
obj_list.append(ask)
obj_list.append(Person)
for item in obj_list:
#打印函数和类中的东西,并且打印它们返回的东西
print(item())
'''
输出结果
bobby
None---ask()函数没有返回值,故函数返回None
hello bobby
<__main__.Person object at 0x0219F8D0>-----类的返回(实际是init函数的返回),Person()实例化后返回一个对象(函数返回对象)
'''

(3)补充实例:函数可以返回None,可以返回一个对象,也可以返回一个函数(装饰器实现原理)

def ask(name="bobby"):
print(name)
print("-----函数可以返回一个函数---")
def decorator_func():
print("我是一个函数")
return ask
my_ask = decorator_func()
my_ask("Tom")
'''
输出结果
我是一个函数
Tom
'''

(4)函数和类可以作为参数传递给函数

def ask(name="bobby"):
print("传递一个函数")
class Person:
def __init__(self):
print("传递一个类")
print("---函数和类可以作为参数传递给函数---")
def chuandi(content):
content()
# 传递函数
chuandi(ask)
# 传递类
chuandi(Person)
'''
输出结果
传递一个函数
传递一个类
'''

(5)函数和类可以当作函数的返回值

def ask(name="bobby"):
print(name)
class Person:
def __init__(self):
print("返回一个类")
print("-----函数可以返回一个函数和类---")
def decorator_func():
print("我是一个函数")
return ask
my_ask = decorator_func()
my_ask("返回一个函数")
def decorator_func1():
print("我是一个函数")
return Person
my_person = decorator_func1()
my_person()
'''
输出结果
我是一个函数
返回一个函数
我是一个函数
返回一个类
'''

2、type、object和class的关系

(1)type->class->obj

类(class)是由type类生成的一个对象,平时所熟悉的对象obj是由类(class)对象创建的一个对象

type两种用法:一,生成一个类;二,返回一个对象的类型

(1.1)返回对象的类型

1是一个int类的对象,类本身也是一个对象,由type(int)知,int是type类的对象,因此生成过程是type->int->1

abc是str类的对象,类本身也是一个对象,由type(str)知,str是type类的对象,因此生成过程是type->str->abc

自己创建的类也符合该逻辑,type生成类对象(内置的类或自定义的类),类对象产生实例

(2)object是所有类都要继承的最顶层的一个基础类

__base__查看类的基类

(3)type也是一个类,同时type也是一个对象

type的基类也是object

object是所有类的基类,类同时也是对象,由type(object)知object是由type生成的

object之上,没有基类

(4)type、class、object关系图

(4.1)内部类以及自定义类默认继承object,object是所有类的一个基类,type也继承它

(4.2)object是type的实例,list等所有的内置类和自定义类都是由type创建的,type创建了所有对象(函数和类等)。如,list是一个类,它也是一个对象的原因在于,它是由type创建的,所以类也是对象(设计原因:类加载到内存后不能修改,而对象则能随时修改,比较方便)

(4.3)object是type的实例,type继承了object,type也是type自身的实例,其他都是type的实例,故一切皆对象

object是所有类的基类,所有的类最终往上追溯都继承它,object继承为空

type既是一个类又是一个对象,所有的类往上追溯都是由type创建的,包括它自己

一、python中的一切皆对象的更多相关文章

  1. python中的一切皆对象

    python中一切皆对象是这个语言灵活的根本.函数和类也是对象,属于python的一等公民.包括代码包和模块也都是对象.python的面向对象更加彻底. 可以赋值给一个变量可以添加到集合对象中可以作为 ...

  2. 第二章python中的一切皆对象

    1.函数和类也是对象,属于python的一等公民 赋值给一个变量 可以添加到集合对象之中 可以作为参数传递给函数 可以当作函数的返回值 def ask(name="ask_wzh" ...

  3. Python中的变量引用对象需注意的几点

    Python中的变量引用对象需注意的几点 分类:Python (55)  (0) 普通引用: Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须 ...

  4. Python中的可迭代对象

      Python中的可迭代对象有:列表.元组.字典.字符串:常结合for循环使用: 判断一个对象是不是可迭代对象: from collections import Iterable isinstanc ...

  5. python中的类,对象,方法,属性等介绍

    注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  6. python 变量作用域 v.__sizeof__() python 深复制 一切皆对象 尽量减少内存消耗

    python 深入理解 赋值.引用.拷贝.作用域 - 江召伟 - 博客园 https://www.cnblogs.com/jiangzhaowei/p/5740913.html a=[1,2,5]b= ...

  7. 初识python中的类与对象

    这篇博客的路线是由深入浅,所以尽管图画的花花绿绿的很好看,但是请先关注我的文字,因为初接触类的小伙伴直接看类的实现可能会觉得难度大,只要耐着性子看下去,就会有一种“拨开迷雾看未来”的感觉了. 一.py ...

  8. 实习小记-python中不可哈希对象设置为可哈希对象

    在这篇之前,我又专门翻译过官方python3.3的可哈希对象文档,大家可以先参考一下: 实习小记-python中可哈希对象是个啥?what is hashable object in python? ...

  9. python中的is, ==与对象的相等判断

    在java中,对于两个对象啊a,b,若a==b表示,a和b不仅值相等,而且指向同一内存位置,若仅仅比较值相等,应该用equals.而在python中对应上述两者的是‘is’ 和‘==’. (1) py ...

随机推荐

  1. asp.net webapi 生成在线文档--Swagger

    第一步:使用nuget包获取Swashbule.swagger.net.ui的包并安装. 安装成功后 打开App_Start->SwaggerNet.cs 注释掉一下两行 //[assembly ...

  2. ubuntu配置neuwork网络

    ubuntu 网络配置 检查网络配置命令:ifconfig 一.通过配置文件配置 新手没怎么用过Ubuntu,所以走了不少弯路,网上找了很多方法,大都没对我起到帮助作用,所以把自己的配置方法写一写. ...

  3. linux查看日志文件命令

    转:https://www.cnblogs.com/zdz8207/p/linux-log-tail-cat-tac.html linux查看日志文件内容命令tail.cat.tac.head.ech ...

  4. 两种语言实现设计模式(C++和Java)(二:单例模式)

    本篇介绍单例模式,可以说是使用场景最频繁的设计模式了.可以根据实例的生成时间,分为饿汉模式和懒汉模式 懒汉模式:饿了肯定要饥不择食.所以在单例类定义的时候就进行实例化. 饿汉模式:故名思义,不到万不得 ...

  5. 添加PROPAGATION_REQUIRES_NEW 事务没有产生作用

    最近在做事务添加时  发现自己的事务没有新建,上网查到   仅用作收藏. 其二  注意  事务的注解  应该在 内层的事务上面 一.描述Spring遇到嵌套事务时,当被嵌套的事务被定义为“PROPAG ...

  6. 常用css

    边框 css   基本设置:border:1px solid #d2d2d2;    风格有:solid=>实线 double=>双实线 dotted=>点状 dashed=> ...

  7. HTML标记语言

    一.html的文档结构 html含义为超文本标记语言,html文档重要由4个标签来组成就是<html>  <head>  <title>  <body> ...

  8. JS 获取图片标签和所有的图片中的src的正则表达式

    var imgReg = /<img.*?(?:>|\/>)/gi; //匹配所有img标签的正则表达式规则 var srcReg = /src=[\'\"]?([^\'\ ...

  9. vscode C++开发环境配置教程(教你如何用vscode写C++)

    用了一段时间的cb,Devc++,但一直感觉cb的高亮太差,而Devc++使用体验差(尤其是代码补全功能),换过vs2017,但是由于其太大了,卡顿十分明显,所以最终选择了vscode这款轻量级编译器 ...

  10. day10 参数args kwargs 作用域

    函数参数/作用域/args/kwargs 1.参数 1.1参数基本知识 任意个数 任意类型 func("1",True) 1.2位置传参(调用函数并传入参数) def func(a ...