Python 是动态语言,解释执行,运行速度慢;
文件名可以是同名不同包
包/模块/ 比如:p1/util.py p2/util.py
包下面必须有__init__.py 这样才能把包当成目录处理
Python的网络服务器有TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer,而服务器运行模式有 多进程ForkingMixin 和 多线程ThreadingMixin两种。
Python学习OOP
OOP基本思想:类和实例
1.类:程序员 (一个群体)
对象:你,我。。
属性:姓名,性别,年龄。。
功能:写代码,修电脑。。(隐藏实现细节–封装)
实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的。
实例的属性优先级高于类属性的优先级
2.oop:继承封装和多态
3.继承:python可以实现多继承
程序员:
前端程序员
后端程序员:python程序员,Java程序员
球迷python程序员:python程序员+足球迷
类组成:属性+功能
class ClassName(object):
#class statement
Pass
//构造函数 设置类的属性
def __init__(self):
pass
//析构函数: 销毁对象的时候调用的,即垃圾回收的时候被调用
def __del__(self):
pass
两个内建函数:
dir()//返回对象的属性
type()//获取对象的类型
新式类和旧式类的区别:
class OldStyle:
def __init__(self,name,description):
self.name=name
self.description=description
class NewStyle(object):
def __init__(self,name,description):
self.name=name
self.description=description
if __name__=='__main__':
old=OldStyle('old','Old style class')
print old
print type(old)
print dir(old)
print '-------------'
new=NewStyle('new','New style class')
print new
print type(new)
print dir(new)
输出:
<__main__.OldStyle instance at 0x7f1242ae7488>
['__doc__', '__init__', '__module__', 'description', 'name']
-------------
<__main__.NewStyle object at 0x7f1242adeb90>
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'description', 'name']
Python没有访问控制,没有提供私有属性功能;全靠自觉
class test:
gender=‘male’ #直接在类下面定义
def init(self,name,age,weight):#在构造函数中定义
self.name=name #这样直接定义
#加一个下划线,表示类的私有属性,但不是真正的私有属性
self._age=age
#加2个下划线,效果:类内可以访问,该类生成的对象再访问就不可以
self.__weight=weight
例子:
class Test(object):
hobby='play game'
def __init__(self,name,age,weight):
self.name=name
self._age=age
self.__weight=weight
def getWeight(self):
return self.__weight
if __name__=='__main__':
test=Test('Tom',25,100)
print test.__dict__ #查看构造函数中的属性
print test.getWeight() # call attribute
print test._Test__weight #change a way to call attribute
输出:
{'_age': 25, '_Test__weight': 100, 'name': 'Tom'}
100
100
1.函数和方法区别:
函数:直接调用函数名来调用的
方法:是类的一部分,必修和对象结合使用
类的方法也是类的属性
2.常用的方法
定义:类似属性定义
class Test(object):
def add(self):#常用
pass
def _minus(self):
pass
def __multiply(self):
pass
下面这2个也可以成为装饰器
@classmethod 调用的时候用类名,而不是用某个对象调用
@property 像访问属性一样调用方法
例子:
class Test(object):
hobby='play game'
def __init__(self,name,age,weight):
self.name=name
self._age=age
self.__weight=weight
@classmethod
def getHobby(cls):
return cls.hobby
@property
def getWeight(self):
return self.__weight
def self_introduce(self):
print 'My name is %s ,I am %s years old\n' %(self.name,self._age)
if __name__=='__main__':
test=Test('Tom',24,120) #创建对象
print test.getWeight #120
print Test.getHobby() #类名调用
test.self_introduce() #普通方法,对象调用
输出:
120
play game
My name is Tom ,I am 24 years old
可以实现代码的复用
1.定义类的继承
class DerivedClassName(BaseClassName):
statement
2.方法继承的关键字super
子类继承父类的属性和方法,也可以自己定义,覆盖父类的属性和方法
class Father(object):
def method(self,arg):
pass
class Son(Father):
def method(self,arg):
super(Son,self).method(arg)
3.子类类型的判断
isinstance() 判断父类
issubclass() 判断子类
4.多继承
class SonClass(FatherClass,MotherClass):
pass
例子:
class Father(object):
hobby='play game'
def __init__(self,name,age,weight):
self.name=name
self._age=age
self.__weight=weight
@classmethod
def getHobby(cls):
return cls.hobby
@property
def getWeight(self):
return self.__weight
def self_introduce(self):
print 'My name is %s ,I am %s years old\n' %(self.name,self._age)
class Son(Father):
def __init__(self,name,age,weight,language):
super(Son,self).__init__(name,age,weight)
self.language=language
if __name__=='__main__':
son=Son('Tom',24,120,'python')
print dir(son)
print son.__dict__
print type(son)
print Son.getHobby()
print isinstance(son,Father) #判断Father是否是son的父类
输出:
['_Father__weight', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_age', 'getHobby', 'getWeight', 'hobby', 'language', 'name', 'self_introduce']
{'_age': 24, '_Father__weight': 120, 'name': 'Tom', 'language': 'python'}
play game
True
理解:解决同一问题的不同流程
多态的要素:继承,方法重写
class Father(object):
def __init__(self,name,age):
self.name=name
self._age=age
def self_introduce(self):
print 'My name is %s ,I am %s years old.' %(self.name,self._age)
class Son(Father):
def __init__(self,name,age,language):
super(Son,self).__init__(name,age)
self.language = language
def self_introduce(self):
print 'My name is %s,My favorite language is %s' %(self.name,self.language)
def introduce(obj):
if isinstance(obj,Father):
obj.self_introduce()
if __name__ == '__main__':
father = Father('Tom',44)
son = Son('Alpha',18,'python')
introduce(father) # False 父类的self_introduce()
introduce(son) # True 子类的self_introduce()
输出:
My name is Tom ,I am 44 years old.
My name is Alpha,My favorite language is python
7.1 Magic method魔术方法:
长什么样:方法名前后有两个下划线
比如:def init(self):
7.2 对象的初始化
class Person():
#创建类的对象,默认的
def new(cls, *args, **kwargs):
return 对象
#初始化对象
def init(self):
pass
#回收对象,默认的
def del(self):
pass
例子:
class Person(object):
def __new__(cls, *args, **kwargs):
print 'call __new__method'
print args
return super(Person,cls).__new__(cls, *args, **kwargs)
def __init__(self,name,age):
print 'call __init__method'
self.name=name
self.age=age
if __name__=='__main__':
per=Person('Tom',31)
print per.__dict__ #打印构造函数中的属性
输出:
call __new__method
('Tom', 31)
call __init__method
{'age': 31, 'name': 'Tom'}
7.3 类与运算符
class Person(object):
#在类内使用的魔术方法--比较运算符
def __cmp__(self, other): #比较两个对象所有
pass
def __eq__(self, other):#equal
pass
def __lt__(self, other):#less than
pass
def __gt__(self, other):#great than
pass
#加减乘除运算符
def __add__(self, other):
pass
def __sub__(self, other):
pass
def __mul__(self, other):
pass
def __div__(self, other):
pass
#逻辑运算符
def __or__(self, other):
pass
def __and__(self, other):
pass
例子:
class Person():
def __init__(self,name,age):
self.m_name = name
if isinstance(age,int):
self.m_age=age
else:
raise Exception('Age must be int')
def __eq__(self, other):
if isinstance(other,Person):
if self.m_age == other.m_age:
return True
else:
return False
else:
raise Exception('The type of object must be Person.')
def __add__(self, other):
if isinstance(self,Person):
return self.m_age + other.m_age
else:
raise Exception('The type of object must be Person')
if __name__ == '__main__':
p1=Person('Alapa',12)
p2=Person('Beta',12)
print p1 == p2 #False
print p1 + p2 #25
7.4类的展现
#转换成适合人看的字符串
def str(self):
#转换成适合机器看的字符串
def repr(self):
def unicode(self):
#展现对象的属性
def dir(self):
7.5类的属性控制
设置对象属性:
def setattr(self, key, value):
self.dict[key]=value
查询对象属性:
def getattr(self, item): #访问属性默认没有查询到的情况下调用
pass
def getattribute(self, item): #每次访问属性一定调用到
pass
删除对象属性:
def delattr(self, item):
pass