首页 > 技术文章 > PYTHON之路(七)

joey251744647 2016-03-12 17:35 原文


多态







看到每个动物类都有自己的talk方法,调用时需明确指定是那个动物实例要调用talk方法,才不会错。
这时定义一个函数,提供统一的调用接口,是猫就调用猫类的talk方法。完成对多态的模拟。obj参数未指定类型,即可传递任何参数。

比如java语言, 他的统一接口是这样写的:

def animalTalk(object obj):
print(obj.name,": ", obj.talk())

object obj意思即所有基类都来调用。要不然的明确指明: dog obj 则只能dog类能调用。
#######################################################################


类的方法

classmethod 不能访问实例变量


  




staticmethod 不能访问实例变量和类变量








property 将方法变成属性,调用时无需(), 不接受参数, 需用.setter赋予值, 用.deleter 删除赋予的值。

 






类的私有属性 self.__num = num #私有属性, 类能访问,实例不能.实在要访问, 用实例._类名__num , 如a._animal__num


###########################################################################

经典类 深度优先 B(A), C(A), D(B,C) D -- > B -- > A -- > C




新式类 广度优先 B(A), C(A), D(B,C) D -- > B -- > C -- >A

python3.0不管经典还是新式类,都是广度优先



############################################################################################

类的特殊成员











打印实例变量和私有属性,不打印类变量









##########################################################################





类的反射 hasattr getattr setattr delattr
hasattr 判断输入字符串是否与实例的属性同名 参数:object + 字符串
getattr 获取此实例属性的内存地址 参数:object + 字符串
setattr 设置函数名成为实例的新属性 参数:object + 字符串 + 函数名
delattr 删除类的属性或者实例拥有的变量和属性 参数:object + 字符串












#!/usr/bin/env python
import sys
class webServer(object):
def __init__(self,host):
self.host = host
def start(self):
print("Server is starting ...")
def stop(self):
print("Server is stoping... ")
def restart(self):
self.stop()
self.start()
def testRun(name):
print("running man ...",name)
if __name__ == '__main__':
server = webServer('localhost')
hasattr(server,sys.argv[1])
func = getattr(server,sys.argv[1])
func()
setattr(server,'run',testRun)
server.run('alex')
delattr(webServer,'start')
print(server.restart())



E:\pycharm_python\s12\day7>python3 反射.py restart
Server is stoping...
Server is starting ...
running man ... alex
Server is stoping...
Traceback (most recent call last):
File "<decoding error>", line 23, in <module>
File "<decoding error>", line 12, in restart
AttributeError: 'webServer' object has no attribute 'start'



############################################################################


socket








socket server socket() -- > bind() -- > listen() -- > accept() -- > receive() -- > sendall()
socket client socket() -- > connect() -- > receive() -- > sendall()













推荐阅读