python 面向对象
关于各种类的属性和方法,下滑线不能_不能打印,否则出错,用中文替代啦,这是简书搞得。
1.--call--
__call__
Python中的函数是一级对象。这意味着Python中的函数的引用可以作为输入传递到其他的函数/方法中,并在其中被执行。
而Python中类的实例(对象)可以被当做函数对待。也就是说,我们可以将它们作为输入传递到其他的函数/方法中并调用他们,正如我们调用一个正常的函数那样。而类中____call__()函数的意义正在于此。
class A(object):
def __init__(self, a, b):
self.__a = a
self.__b = b
def myprint(self):
print('a=', self.__a, 'b=', self.__b)
def __call__(self, num):
print('call:', num + self.__a)
a1 = A(10, 20)
a1.myprint()
print('=========')
a1(80)
('a=', 10, 'b=', 20)
=========
('call:', 90)
https://blog.csdn.net/yaokai_assultmaster/article/details/70256621
2.--new--
class B(object):
def fn(self):
print 'B fn'
def __init__(self):
print "B INIT"
class A(object):
def fn(self):
print 'A fn'
def __new__(cls, a):
print "NEW", a
if a > 10:
return super(A, cls).__new__(cls)
return B()
def __init__(self, a):
print "INIT", a
a1 = A(5)
a1.fn()
print '=='
a2 = A(20)
a2.fn()
输出结果:
NEW 5
B INIT
B fn
==
NEW 20
INIT 20
A fn
https://www.cnblogs.com/kex1n/p/5991249.html
http://python.jobbole.com/86506/
3.getattr() 函数
如下的代码
class A(object):
def __init__(self,a,b):
self.a1 = a
self.b1 = b
print 'init'
def mydefault(self):
print 'default'
a1 = A(10,20)
a1.fn1()
a1.fn2()
a1.fn3()
方法 fn1/fn2/fn3 都没有定义,添加代码,是没有定义的方法都调用mydefault函数,上面的代码应该输出
default
default
default
方法____getattr__只有当没有定义的方法调用时,才是调用他。当fn1方法传入参数时,我们可以给mydefault方法增加一个*args不定参数来兼容。
class A(object):
def __init__(self, a, b):
self.a1 = a
self.b1 = b
print 'init'
def mydefault(self, *args):
print 'default:' + str(args[0])
def __getattr__(self, name):
print "other fn:", name
return self.mydefault
a1 = A(10, 20)
a1.fn1(30)
a1.fn2('hello')
a1.fn3(10)
init
other fn: fn1
default:30
other fn: fn2
default:hello
other fn: fn3
default:10
Python getattr() 函数
GETATTR 的一些理解
4.包管理
一个包里有三个模块,mod1.py, mod2.py, mod3.py,但使用from demopack import *导入模块时,如何保证只有mod1、mod3被导入了。
答案:增加init.py文件,并在文件中增加:
__all__ = ['mod1','mod3']
5.闭包
写一个函数,接收整数参数n,返回一个函数,函数的功能是把函数的参数和n相乘并把结果返回。
答案:
def mulby(num):
def gn(val):
return num * val
return gn
zw = mulby(7)
print(zw(9));
网友评论