python知识点结构(五)(5.1标准类型)5.2控制和函数.- 面向对象
一、类
1、self是什么,1)是实例化对象被传入类中的参数
# 面向对象编程的思想,具体实施:1将所有对象归类,2然后尽可能具体的想每个归类中的功能和属性,3将重叠的类和属性,提炼出来再划归一个新类。
class Pym(object): '''检验self,主动方法格式为骆驼,被动方法为下划线前后''' def attract(self,beigongji): print '%s==='%(beigongji) print 'self IS',self player1 = Pym() player1.attract(1) player2 = Pym() player2.attract(2) >>> 1=== self IS <__main__.Pym object at 0x01B941D0> 2=== self IS <__main__.Pym object at 0x01B941B0> >>>
2、面向对象三大功能之封装
封装的两种方法:|--实例内封装
|--类名+() = 默认执行类中的指定方法 =》__init__ 方法又叫构造方法,定义self.属性为实例封装属性。
|类 | --------》 |-实例 -|
|def__init__ | 《-------- |- -|
|self.name | --------》封装进实例内存 |- name -|
形式为c = C(para) 参数para就被封装在实例c的内存中。
3、面向对象三大功能之继承
术语 : 父类= 基类,子类= 派生类 新式类 = object 经典类什么都不加在定义类时。
所有父类中的方法都能继承 ===== 包括__init__方法
继承特性一:子类(父类),子类方法与父类方法相同时,子类方法生效。
二:子类(父类,A类,B类,...) 可以继承多个父类 只有python可以多继承
三: 子类(父类,A类,B类,...) 当父类,A类,B类,...同属一个父类是,执行一个方法按照先左后右最后父类的父类寻找。
当父类,A类,B类,...不同父类(即复杂情况)类似于C语言的树。
按照树的顺序查找。
————A
—— B ——C
-b -c
e = E(b,c) e方法查找顺序 :bBcCA
—— B ——C
-b -c
e = E(b,c) bBcC
类相当于制造实例的模板
4、面向对象三大功能之多态
多态 顾名思义 方法可以传入多种参数 任何类。
class A()
def f(self)
class B()
def f(self)
def func(arg):
arg.f()
a = A() ,b = B()
func(a),func(b)
类中的运行流程
1、实例化后只有__INIT__执行,其他def都只在调用的时候执行。
class Zhu(): def dIng(self): self.name = 'lim' print '%s = '%(self.name) sk = Zhu() sk.dIng() 原来未执行这个函数时,会提示实例没有name属性。 print sk.name >>> Traceback (most recent call last): File "C:/Python27/feng.py", line 6, in <module> print sk.name AttributeError: Zhu instance has no attribute 'name' >>> ================================ RESTART ================================ >>> lim = lim >>>
2、魔法方法
__Init__
1)class Foo: Foo() 实例化一个对象,并默认执行init函数。注意init函数被python限制只能返回None,即不能使用return 值。见下例
class Foo:
def __init__(self):
print 'exec init'
return 10000
def __call__(self):
print 'exec call'
return 'call'
f = Foo()#实例化一个对象,执行init方法。此时f为10000
print f
>>>
exec init
Traceback (most recent call last):
File "C:/Python27/mo.py", line 15, in <module>
f = Foo()#实例化一个对象,执行init方法。此时f为10000
TypeError: __init__() should return None
>>>
2、__call__
实例后加括号,默认执行类中方法__call__,可以有返回值。
class Foo:
def __init__(self):
print 'exec init'
def __call__(self):
print 'exec call'
return 'call'
f = Foo()#实例化一个对象,执行init方法。此时f为10000
print f
print 'f()==='
f()
print 'Foo()() === '
Foo()()
print 'c = '
c=f()#这里对象c 应该接收返回值call
print c
print 'd ='
d=Foo()()#这里对象d不是Foo实例 而是用来接收Foo()实例的Call方法后的返回值’call‘
print d
>>>
exec init
<__main__.Foo instance at 0x01ADBD00>
f()===
exec call
Foo()() ===
exec init
exec call
c =
exec call
call
d =
exec init
exec call
call
>>>
5、面向对象编程方法的基本成员
实例相关的 有 普通字段,普通方法(类中的带self的方法)
类相关 有 静态字段,静态方法,类方法
注意 以上的字段和方法类和实例均可调用只是最好是按照各自的规范调用。
注意静态方法和类方法在函数前加修饰符是有意义的,若正常使用def(),则无论是类还是实例都无法正常调用。见下例。
#! /usr/bin/env python
class ConnectPool:
__instance = None
def __init__(self):
self.ip = '10.10.10.18'
self.port = '8080'
@staticmethod
def connectPo():
if ConnectPool.__instance:
return ConnectPool.__instance
else:
ConnectPool.__instance = ConnectPool()
return ConnectPool.__instance
def cp():
if ConnectPool.__instance:
return ConnectPool.__instance
else:
ConnectPool.__instance = ConnectPool()
return ConnectPool.__instance
def getConnect(self):
import random
cntor = random.randint (1,10)
return cntor
obj1 = ConnectPool.connectPo()
cntsor = obj1.getConnect()
print 'obj1%s use %s connection connect internet'%(obj1,cntsor)
'''a = obj1.cp()
print a'''
onj = ConnectPool.cp()
>>>
obj1<__main__.ConnectPool instance at 0x01C7BBE8> use 6 connection connect internet
Traceback (most recent call last):
File "C:/Python27/zhenhgchanghanshu.py", line 35, in <module>
a = obj1.cp()
TypeError: cp() takes no arguments (1 given)
>>> ================================ RESTART ================================
>>>
obj1<__main__.ConnectPool instance at 0x01ACBD00> use 10 connection connect internet
Traceback (most recent call last):
File "C:/Python27/zhenhgchanghanshu.py", line 38, in <module>
onj = ConnectPool.cp()
TypeError: unbound method cp() must be called with ConnectPool instance as first argument (got nothing instead)
>>>
下面的例子演示了类方法的应用。
#! /usr/bin/env python
class ai:
def __init__(self,nm):
self.name = nm
@classmethod
def deduction(cls):
smallball = cls('smalbal')
return smallball
def act(self):
return self.name
primaryball = ai('org')
a = primaryball.act()
print a
regenerate = ai.deduction()
b= regenerate.act()
print b
>>>
org
smalbal
>>>
浙公网安备 33010602011771号