python嵌套类(内部类相互调用)_核心解密Python函数在(类与函数之间)和(类与类之间)互相调用...
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函数在(类与函数之间)和(类与类之间)互相调用...相关推荐
- python类的构造方法名称_搞懂Python的类和对象名称空间
代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间:文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层函 ...
- python类方法需要传入cls参数_如何从Python 3.x中的类定义传递参数到元类?
这是如何从类定义向元类传递参数的python 3.x版本?问题,根据请求单独列出,因为答案与python 2.x明显不同. 在python 3.x中,如何将参数传递给元类的__prepare__.__ ...
- python什么是调用_什么是Python中的可调用?
jfs.. 79 从Python的源代码object.c: /* Test whether an object can be called */ int PyCallable_Check(PyObje ...
- python中的类是什么意思_如何理解python中的类和方法(转)
一.python中类和对象的概念 首先,我们先来说说什么是类.看了很多关于python类的介绍,大多都介绍如何使用,但是对于概念却一笔带过,一个初学编程的小伙伴很难理解. 概括的说:类可以比作是某种类 ...
- python 类初始化参数校验_如何规避python参数的初始化次数?
我们在内存不足的时候,除了增加内存的可用度,可以进行一个清理内存的初始化操作,当然这种是最后迫不得已的选择.我们在python中也有需要用到初始化的地方,鉴于参数和函数的关系密不可分,本篇我们会简单的 ...
- python的名字来源于什么故事_从认识Python开始吧
认识Python 编写Python程序的文件,称为Python的脚本或者程序 要求Python文件的后缀名为.py print()是一个打印函数,可以输出数字.字符串.或者其他的内容 函数就是为了实现 ...
- python底层与机器底层关系_起底 Python 的底层逻辑
原标题:起底 Python 的底层逻辑 本文配图来自美剧<我们窃取秘密:维基解密的故事>. 文 | 图灵社区 推荐 | 编程派公众号(ID:codingpy) 01 一次纯粹的hackin ...
- python中var是什么变量_一、 Python概述、变量
一. Python概述 1.python是一门面向对象,解释型的脚本语言.语法简洁,编写效率高,但是执行(底层运行)效率低(总的来说解释语言执行效率低于编译语言). 注意:本博客所有的代 ...
- python set 排序_python set 排序_如何在Python中使用sorted()和sort()
点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基 著 18财税3班 李潇潇 译 日期:2019年5月6日 一. 使用sorted() ...
最新文章
- 妙用终截者密码锁防***注入Explorer
- 【转载】反向代理为何叫反向代理?
- Hadoop(十)Hadoop IO之数据完整性
- .net之生成图表的控件(柱状图,曲线图,饼状图) [转]
- c++中同名函数的三个不同术语(c++细节篇八)
- python anaconda和pycharm_Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项...
- 从机器翻译到阅读理解,一文盘点PaddlePaddle官方九大NLP模型
- awl 多线程syn***
- mysql统计一张表中条目个数的方法
- python之scipy库详解
- 登录Unity官方商店时提示Sorry, this link is no longer valid.(此链接已失效)
- R语言中的Factor到底是什么?
- 程序员,我要为了这个名号而疯狂
- python关于二手房的课程论文_用Python对二手房信息数据清洗及简单分析
- python fun函数、求4x4整型数组的主对角线元素的和_C语言编程求一个4x4数组左下三角 包括主对角线元素的和...
- 计算机组成原理---第二章运算器和运算方法
- 电脑window medio player播放器可倍速播放
- mysql如何加索引的时候不锁表
- 51单片机(ESP8266模块)
- linux下载流量和上传流量,通过linux的tc工具简单实现上传和下载的流量控制
热门文章
- SVM 训练--在训练集上acc为94% 在测试集上为70%
- js-array自增长方式
- 鸿蒙撕系统裂安卓阵营,鸿蒙系统年底问世 安卓阵营是不是该瑟瑟发抖了
- linux查usb版本,怎么查看 ubuntu usb版本
- 无人驾驶(ncnn学习)
- 常量与变量的区别(详细说明)(学习笔记3--变量与常量)
- fetch jsonp连接mysql_fetch跨域浏览器请求头待研究
- matlab anova 如何不画图,方差分析的数据处理和作图
- 辐射4核能选项用计算机失败,gg修改器出现保护进程加载失败怎么解决 | 手游网游页游攻略大全...
- SQLi LABS Less 14 报错注入+布尔盲注