image.png

一、类与函数之间

首先来看一个函数间的调用

类方法:

#实现类中函数之间互相调用

#下面一个学生的简单自我介绍为例子

__metaclass__=type #自由的、动态的修改/增加/删除 类的或者实例中的方法或者属性

class Stu:

#指定类要处理的参数

name=None #先设定为空,下面会传入

age=None

major=None

school="哈尔滨工业大学"#类变量,被所有学生实例共有的属性或者特征

def __init__(self,name,age,major): #构造名字与年龄的init方法

self.name=name

self.age=age

self.major = major

def Name_Age(self): #构造姓名与年龄的函数,分别传入self对应的年龄与姓名参数

print("我叫" + self.name+ "," + "今年" + str(self.age) + "岁," + "主修专业" + self.major + "。") #遇到(,。文字等)都加“ ”

def School(self): #再构造一个函数来说明学生的学校信息,可提前设定好,或者重新构造一个

print("来自",Stu.school)

def Total(self): #最后构造一个函数来互相调用上面的两个函数Name_Age和School

Stu.Name_Age(self)

Stu.School(self)

#######################################################

#先整体传入参数

stu=Stu("马小云",20,"空气动力学") #传入姓名与年龄

#############################################

#(原始的调用方法)实例化对象进行调用

print("***********************各自函数调用的方法********************************")

stu.Name_Age() #调用指定函数

stu.School() #再调用其他函数

#############################################

#(函数之间互相调用之后的方法)使用类中函数调用其他函数

print("***********************类中方法互相调用函数********************************")

stu.Total() #导出结果

#######################################################

执行结果:

image.png

备注:

(一)metaclass的作用是什么?

metaclass能有什么用处,先来个感性的认识:

你可以自由的、动态的修改/增加/删除 类的或者实例中的方法或者属性

批量的对某些方法使用decorator,而不需要每次都在方法的上面加入@decorator_func

当引入第三方库的时候,如果该库某些类需要patch的时候可以用metaclass

可以用于序列化(参见yaml这个库的实现,我没怎么仔细看)

提供接口注册,接口格式检查等

自动委托(auto delegate)

more...

(二)metaclass的相关知识

what is metaclass?

1.1 在wiki上面,metaclass是这样定义的:In object-oriented programming,

a metaclass is a class whose instances are classes.

Just as an ordinary class defines the behavior of certain objects,

a metaclass defines the behavior of certain classes and their instances.

也就是说metaclass的实例化结果是类,而class实例化的结果是instance。我是这么理解的:

metaclass是类似创建类的模板,所有的类都是通过他来create的(调用new),这使得你可以自由的控制

创建类的那个过程,实现你所需要的功能。

(三)metaclass基础

一般情况下, 如果你要用类来实现metaclass的话,该类需要继承于type,而且通常会重写type的new方法来控制创建过程。

当然你也可以用函数的方式(下文会讲)

在metaclass里面定义的方法会成为类的方法,可以直接通过类名来调用

(四)如何使用metaclass

4.1 用类的形式

4.1.1 类继承于type, 例如: class Meta(type):pass

4.1.2 将需要使用metaclass来构建class的类的metaclass属性(不需要显示声明,直接有的了)赋值为Meta(继承于type的类)

4.2 用函数的形式

4.2.1 构建一个函数,例如叫metaclass_new, 需要3个参数:name, bases, attrs,

name: 类的名字

bases: 基类,通常是tuple类型

attrs: dict类型,就是类的属性或者函数

4.2.2 将需要使用metaclass来构建class的类的metaclass属性(不需要显示声明,直接有的了)赋值为函数metaclas_new

(五) metaclass 原理

5.1 basic

metaclass的原理其实是这样的:当定义好类之后,创建类的时候其实是调用了type的new方法为这个类分配内存空间,创建

好了之后再调用type的init方法初始化(做一些赋值等)。所以metaclass的所有magic其实就在于这个new方法里面了。

说说这个方法:new(cls, name, bases, attrs)

cls: 将要创建的类,类似与self,但是self指向的是instance,而这里cls指向的是class

name: 类的名字,也就是我们通常用类名.name获取的。

bases: 基类

attrs: 属性的dict。dict的内容可以是变量(类属性),也可以是函数(类方法)。

所以在创建类的过程,我们可以在这个函数里面修改name,bases,attrs的值来自由的达到我们的功能。这里常用的配合方法是

getattr和setattr(just an advice)

二、类与类之间调用函数

下面实现python中在一个类中调用另一个类的函数方法

#实现类与类中的函数调用

class Person: #构造第一个类

def __init__(self,name): #先定义init方法,指定参数

self.name = name

def go_to(self,position,type): #构造的函数

'''

:param position:地名参数

:param type:去的方法

:return:

'''

print('去:' + position)

#此处调用另一个类:Car类的方法

type.run()

class Car: #构造第二个类

def run(self):

print('走你~')

call = Person('小王')

#为了让小王调用Car类中的run()方法,需实例化出一辆车

toll = Car()

#通过将Car类的对象toll传给call这个对象,从而达到调用toll方法run()的目的

call.go_to('上海',toll)

或者下面来一个号理解的例子

#实现调用类与类之间的函数方法

import numpy as np

class Calculate(object): #构造第一个类

def add(self, a, b): #构造加法函数

a1 = np.add(a, b)

return a1

def multiply(self,a, b):#构造乘法函数

a2= np.multiply(a, b)

return a2

def reduce(self,a,b):#构造减法函数

a3 = np.subtract(a, b)

return a3

def division(self,a, b):#构造除法函数

a4 = np.divide(a, b)

return a4

class Total_grade(object):#构造第二个类

def __init__(self): #构建一个init方法

self.Calculate = Calculate() #该方法调用第一个类的方法

def get_id(self,id): #身份证号或者什么号都行

return id

def get_name(self, grade):#名称参数

return grade

def get_totalgrade(self, c, d):#调用第二类方法 下面调用第一类方法

return self.Calculate.add(c, d)#加法或者其他

s = Total_grade()

print(s.get_id('1234567890'))

print(s.get_name('张飞'))

print(s.get_totalgrade(2019,2020))

执行结果:

image.png

三、嵌套类之间的函数调用

1、内部与外部的类的调用

先来介绍内部类与外部类是什么?

看源码解析:

#先来实现一个简单的init嵌套类的交互方法

class MyOuter:#构造外部类

age=19 #定义一个参数,这里暂时用不上,只是想说明类开始也可传入恒定参数

def __init__(self,name):#构造一个init函数

self.name=name

class MyInner: #构造内部法类

def __init__(self,inner_name): #类似的构造一个init函数

self.inner_name=inner_name

###########################################################################

out=MyOuter('王小二在门外(外部类)') #实例化调用外部的类

#####################################

#直接实例化内部类调用

inner=out.MyInner('王小二在房间里inner(内部类)') #在从外部进入内部的类的函数

print(inner.inner_name) #将实例中的参数传入:王小二在房间里inner(内部类)=inner_name

##########################################################################

#直接实例化外部类调用

out2=MyOuter #外部类参数

print(out2.age) #调用外部类方法

2、嵌套类之间的互相调用

内部类调用外部类的类属性和类方法

#实现内部类调用外部类的类属性和类方法:这里是类属性和类方法

class MyOuter:

age=19

def __init__(self,name):

self.name=name

'''

:#描述:classmethod 修饰符对应的函数不需要实例化,

:不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,

:可以来调用类的属性,类的方法,实例化对象等。

'''

@classmethod

def outer_class_method(cls):

print('我是外部类的类方法')

class MyInner:

def __init__(self,inner_name):

self.inner_name=inner_name

def inner_method(self):

print('我是内部类的对象方法')

MyOuter.outer_class_method()

out=MyOuter('在门外')

inner=out.MyInner('在屋里inner')

inner.inner_method() #执行调用内部函数

3、内部类调用外部对象的对象属性和方法

class MyOuter:

age=24

def __init__(self,name):

self.name=name

@classmethod

def outer_class_method(cls):

print('我是外部类的类方法')

def outer_obj_method(self):

print('我是外部类对象的绑定方法')

class MyInner:

def __init__(self,inner_name,obj):

self.inner_name=inner_name

self.obj=obj

def inner_method(self):

print('我是内部类的对象方法')

MyOuter.outer_class_method()

self.obj.outer_obj_method()

out=MyOuter('外部类')

inner=out.MyInner('从外部类进入内部类inner',out)

inner.inner_method() #调用方法

参考文献

python嵌套类(内部类相互调用)_核心解密Python函数在(类与函数之间)和(类与类之间)互相调用...相关推荐

  1. python类的构造方法名称_搞懂Python的类和对象名称空间

    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间:文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层函 ...

  2. python类方法需要传入cls参数_如何从Python 3.x中的类定义传递参数到元类?

    这是如何从类定义向元类传递参数的python 3.x版本?问题,根据请求单独列出,因为答案与python 2.x明显不同. 在python 3.x中,如何将参数传递给元类的__prepare__.__ ...

  3. python什么是调用_什么是Python中的可调用?

    jfs.. 79 从Python的源代码object.c: /* Test whether an object can be called */ int PyCallable_Check(PyObje ...

  4. python中的类是什么意思_如何理解python中的类和方法(转)

    一.python中类和对象的概念 首先,我们先来说说什么是类.看了很多关于python类的介绍,大多都介绍如何使用,但是对于概念却一笔带过,一个初学编程的小伙伴很难理解. 概括的说:类可以比作是某种类 ...

  5. python 类初始化参数校验_如何规避python参数的初始化次数?

    我们在内存不足的时候,除了增加内存的可用度,可以进行一个清理内存的初始化操作,当然这种是最后迫不得已的选择.我们在python中也有需要用到初始化的地方,鉴于参数和函数的关系密不可分,本篇我们会简单的 ...

  6. python的名字来源于什么故事_从认识Python开始吧

    认识Python 编写Python程序的文件,称为Python的脚本或者程序 要求Python文件的后缀名为.py print()是一个打印函数,可以输出数字.字符串.或者其他的内容 函数就是为了实现 ...

  7. python底层与机器底层关系_起底 Python 的底层逻辑

    原标题:起底 Python 的底层逻辑 本文配图来自美剧<我们窃取秘密:维基解密的故事>. 文 | 图灵社区 推荐 | 编程派公众号(ID:codingpy) 01 一次纯粹的hackin ...

  8. python中var是什么变量_一、 Python概述、变量

    一.        Python概述 1.python是一门面向对象,解释型的脚本语言.语法简洁,编写效率高,但是执行(底层运行)效率低(总的来说解释语言执行效率低于编译语言). 注意:本博客所有的代 ...

  9. python set 排序_python set 排序_如何在Python中使用sorted()和sort()

    点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基  著 18财税3班 李潇潇    译 日期:2019年5月6日 一. 使用sorted() ...

最新文章

  1. 妙用终截者密码锁防***注入Explorer
  2. 【转载】反向代理为何叫反向代理?
  3. Hadoop(十)Hadoop IO之数据完整性
  4. .net之生成图表的控件(柱状图,曲线图,饼状图) [转]
  5. c++中同名函数的三个不同术语(c++细节篇八)
  6. python anaconda和pycharm_Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项...
  7. 从机器翻译到阅读理解,一文盘点PaddlePaddle官方九大NLP模型
  8. awl 多线程syn***
  9. mysql统计一张表中条目个数的方法
  10. python之scipy库详解
  11. 登录Unity官方商店时提示Sorry, this link is no longer valid.(此链接已失效)
  12. R语言中的Factor到底是什么?
  13. 程序员,我要为了这个名号而疯狂
  14. python关于二手房的课程论文_用Python对二手房信息数据清洗及简单分析
  15. python fun函数、求4x4整型数组的主对角线元素的和_C语言编程求一个4x4数组左下三角 包括主对角线元素的和...
  16. 计算机组成原理---第二章运算器和运算方法
  17. 电脑window medio player播放器可倍速播放
  18. mysql如何加索引的时候不锁表
  19. 51单片机(ESP8266模块)
  20. linux下载流量和上传流量,通过linux的tc工具简单实现上传和下载的流量控制

热门文章

  1. SVM 训练--在训练集上acc为94% 在测试集上为70%
  2. js-array自增长方式
  3. 鸿蒙撕系统裂安卓阵营,鸿蒙系统年底问世 安卓阵营是不是该瑟瑟发抖了
  4. linux查usb版本,怎么查看 ubuntu usb版本
  5. 无人驾驶(ncnn学习)
  6. 常量与变量的区别(详细说明)(学习笔记3--变量与常量)
  7. fetch jsonp连接mysql_fetch跨域浏览器请求头待研究
  8. matlab anova 如何不画图,方差分析的数据处理和作图
  9. 辐射4核能选项用计算机失败,gg修改器出现保护进程加载失败怎么解决 | 手游网游页游攻略大全...
  10. SQLi LABS Less 14 报错注入+布尔盲注