美文网首页
python 面向对象

python 面向对象

作者: 逍遥_yjz | 来源:发表于2018-06-19 11:30 被阅读0次

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));

参考链接:https://segmentfault.com/a/1190000012277531

相关文章

网友评论

      本文标题:python 面向对象

      本文链接:https://www.haomeiwen.com/subject/vdkaeftx.html