
正文
python函数内部类 python函数内部定义函数
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
python中类内部的函数可以互相调用吗?
可以调用,比如下面,common_func被多个函数调用。
class MyClass:
def __init__(self):
pass
def func1(self):
# do something
self.common_func()
def func2(self):
# do something
self.common_func()
def common_func(self):
pass
相关问答
Q1: python函数里定义的类
#Python 2.5
#这个可以用修饰器来完成
#但是一般不会限制参数类型
#给python函数内部类你个思路:
def argfilter(*types):
def deco(func): #这是修饰器
def newfunc(*args): #新python函数内部类的函数
if len(types)==len(args):
correct = True
for i in range(len(args)):
if not isinstance(args[i], types[i]): #判断类型
correct = False
if correct:
return func(*args) #返回原函数值
else:
raise TypeError
else:
raise TypeError
return newfunc #由修饰器返回新python函数内部类的函数
return deco #返回作为修饰器python函数内部类的函数
@argfilter(int, str) #指定参数类型
def func(i, s): #定义被修饰的函数
print i, s
#之后python函数内部类你想限制类型的话, 就这样:
#@argfilter(第一个参数的类名, 第二个参数的类名, ..., 第N个参数的类名)
#def yourfunc(第一个参数, 第一个参数, ..., 第N个参数):
# ...
#
#相当于:
#def yourfunc(第一个参数, 第一个参数, ..., 第N个参数):
# ...
#yourfunc = argfilter(第一个参数的类名, 第二个参数的类名, ..., 第N个参数的类名)(yourfunc)
Q2: Python中的常用内置函数有哪些呢?
(1)Lambda函数
用于创建匿名函数,即没有名称的函数。它只是一个表达式,函数体比def简单很多。当我们需要创建一个函数来执行单个操作并且可以在一行中编写时,就可以用到匿名函数了。
Lamdba的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
利用Lamdba函数,往往可以将代码简化许多。
(2)Map函数
会将一个函数映射到一个输入列表的所有元素上,比如我们先创建了一个函数来返回一个大写的输入单词,然后将此函数应有到列表colors中的所有元素。
我们还可以使用匿名函数lamdba来配合map函数,这样可以更加精简。
(3)Reduce函数
当需要对一个列表进行一些计算并返回结果时,reduce()是个非常有用的函数。举个例子,当需要计算一个整数列表所有元素的乘积时,即可使用reduce函数实现。
它与函数的最大的区别就是,reduce()里的映射函数(function)接收两个参数,而map接收一个参数。
(4)enumerate函数
用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。
它的两个参数,一个是序列、迭代器或其他支持迭代对象;另一个是下标起始位置,默认情况从0开始,也可以自定义计数器的起始编号。
(5)Zip函数
用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
当我们使用zip()函数时,如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。
Q3: 核心解密Python函数在(类与函数之间)和(类与类之间)互相调用
首先来看一个函数间的调用
类方法:
执行结果:
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 ),这使得你可以自由的控制
创建类的那个过程,实现你所需要的功能。
当然你也可以用函数的方式(下文会讲)
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
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中在一个类中调用另一个类的函数方法
或者下面来一个号理解的例子
执行结果:
先来介绍内部类与外部类是什么?
看源码解析:
内部类调用外部类的类属性和类方法
参考文献1
参考文献2
参考文献3
Q4: Python 是否有“内部类”?
首先如果照搬格式的话python函数内部类,是行不通的
即便加关键字也是不行的python函数内部类, self 和 cls 在类定义的位置无从谈起。而就算写成 Outer.outer_class_num 也是不可以的python函数内部类,因为这是在类的定义中,类自己的身体还在构造中,如何使用自己呢?
所以如果想写内部类的话,需要写在方法中。
注意图中两个self是不一样的,推荐可以把内部类的self换一个名字。
也可以像这样使用。
Inner是在 __init__ 当中定义的,所以只存在于实例当中。如果想像java的 public static class 那样,需要在类当中定义,这里就要用到 __new__
当然直接这么写是错误的,因为类的 __new__ ,本质也是在实例化的时候才会执行。
也就是说,在未进行过一次实例化之前, __new__ 没有被执行过, Outer类 对象中不存在 Inner内部类
这样才可以正常输出,如果想让类天生自带Inner内部类,就需要用到 metaclass
学习多种语言,确实能相互促进。每当看到一个知识点,总是会想其python函数内部类他语言会怎么解决这个问题。
关于python函数内部类和python函数内部定义函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







