视频地址
http://v.youku.com/v_show/id_XNDg3NjMzNDgw.html
复习一下,类属性的用法。有的类属性是在调用类方法后才建立的,类方法可以创建新的类属性。
每次学习,代码必须纯手打。还好有vim,写起来比较方便。嗯。不错。
如果不运行类方法,那么有的类属性,是没有的。
这样的程序结构如下。
#!/usr/bin/python
#coding:utf8
var4 = "全局变量"
class Milo():
var1 = "类属性,公有属性var1"
__var2 = "类的私有属性 __var2"
def fun(self): # 或者里面写成 def fun(self,x,y,z): 里面传入3个值。
self.var2 = "对象的公有属性var2"
self.__var3 = "对象的私有属性__var3"
var4 = "函数 fun 的局部变量var4"
print var4
print self.__var3
def other(self):
print var4
print self.__var3 # 这表示在运行类方法fun()之后,实例有了个
# self.__var3的变量。所以比较好
zou = Milo()
zou.fun()
# print zou.var4 # 如果不执行类方法fun()的话,那么将没有zou.var4
zou.other() # 单独运行输出self.__var3也不行,应该先运行类方法fun()之后
魔术方法---
{内}{部}{类}--的构造
所谓内部类,就是在类内部定义的类,主要目的是为了更好的抽象现实世界。
内部类的距离:
汽车是个类,汽车的地盘,轮胎也可以抽象为类,将其定义到汽车类中,则形成了内部类,更好的描述汽车类,因为底盘,轮胎是汽车的一部分
一般不赞同使用内部类,会是程序结构复杂,但是理解内部类有助于理解模块的调用。
很多模块会使用内部类
魔术方法,魔术方法,不必实例化,当实例化类的时候,自动操作,
类似是这样的,
class Milo():
name = "csvt"
def __str__(self): # 魔术方法 __XXOO__
print "我是Milo实例化对象"
zou = Milo()
---------------运行的时候--------------
~ python cls_MoShuFangFa.py
我是Milo实例化对象
——————————————————————————————————————
说明在创建实例化对象的时候,就能自己执行一次!很magic!故称作为魔术方法。
------------------魔术函数主要应用---------------
构造函数:
用于初始化类的内部状态,Python提供的够在函数是__init__(); 在实例化时候,自动执行的,__init__() 方法是可选的,如果不提供,python会给出一
个默认的__init__方法;
一般对数据的获取需要自定义的get 和 set 方法
析构函数:
用于释放对象占用的资源,python提供的析构函数是__del__();
__del__()也是可选的,如果不提供,则python会在后台提供默认析构函数
如果要显示的调用析构函数,可以使用del关键字,方式如下:
del 对象名
更多关于魔术方法的介绍:http://pycoders-weekly-chinese.readthedocs.org/en/latest/issue6/a-guide-to-pythons-magic-methods.html#python (一定要看)
~
请看下面的代码案例:
#!/usr/bin/python
#coding:utf8
class Milo():
class Test(): # 内部类和底下这些结构是平行的
var1 = "我是内部类"
# 定义后并不冲突,Milo类还是有这些属性和方法
name = "csvt"
def __str__(self): # 魔术方法,不必实例化,当实例化类的时候,自动操作
return "我是Milo实例化的对象"
def fun1(self):
print self.name
print "我是公有方法"
self.__fun2()
def __fun2(self): # 这是一个内置方法
print self.name
print "我是私有方法"
# @classmethod
def classFun(self):
print self.name
print "我是类方法"
classNewFun = classmethod(classFun)
# @staticmethod
def staticFun(self):
print Milo.name
print "我是静态方法"
staticNewFun = staticmethod(staticFun)
zou = Milo() # 先创建一个实例
print zou #输出的结果是“我是Milo实例化的对象"
内部类构造函数:
自己写一个get 或者 set 方法,
用来自定义一些值。
1。常用 自己写一个 set 方法,来设置类中属性的值
class Moto():
a = "This is a"
b = "This is b"
def set(self,x) # 设置了一个简单的设置类内部变量的方法
self.a = x
if __name__ == "__main__":
obj = Moto()
out = obj.set("How are you?") # 自己定义的类中 get()方法,
print out # 这样的话就直接输出“How are you?"这句话了。
#这是一个简单的设置一个值的方法
2. 常用get方法 来获取 类中属性的值,或者需要的数据
class Moto():
a = "This is a"
b = "This is b"
def get(self,x)
if x == "a":
return self.a
else:
return self.b
obj = Moto()
out = obj.get("a") # 自己定义的类中 get()方法,
print out # 这样的话就直接输出“This is a"这句话了。
构造函数:
#!/usr/bin/python
#coding:utf8
name = "global"
class Ren:
name = "人"
hight = "一人高"
wight = "一人重"
__money = "我有10块钱" # 私有属性
__age = 30
def __init__(self,n = "婴儿"): # 实例化的时候,就会被执行
print "初始化"
self.name = n
def run(self): # 类的方法定义,必须有一个行参
#有人吧self,写成cls 就是class
print self.name # 类中访问自己类的属性。
print "跑步"
def __lie(self): # 私有方法只能被类内部方法使用
print "我很欣赏你"
def say(self):
print "说话"
self.__lie() # 这个表示是调用的当前自己类里面的私有方法
def get(self,x): # 一般在调用私有属性的时候,都是新建一个方法
# 这里用了(self,x)目的是为了使用get("money")
# 这样的用法
# return self.x # 将私有属性封装起来
if x == "money":
return self.__money
elif x == "age":
return self.__age
else:
return "请正确输入"
def set(self,x): # 使用这个方法,我们用来修改内置属性
self.__age = x
def moRi(self):
return "世界末日"
mr = classmethod(moRi) # 类的方法,动态的,不实例化类,也能访问这个方法
# 从内存角度来说,节省内存,别的方法没有加载
if __name__ == '__main__': # 这表示如果被别人调用的话,将不执行
# 被自己调用,执行
zhangsan = Ren("张三") # 把Ren类实例化,变成张三
print zhangsan.name
lisi = Ren("李四")
print lisi.name
wangwu = Ren()
print wangwu.name
wangwu.__init__("王五") # 魔术函数也可以这样用
print wangwu.name
显示的结果为:
alex@universe ~/python/OOP $ python cls_LeiDeGouZao.py
初始化
张三
初始化
李四
初始化
婴儿
初始化
王五
注意:王五上面有两个初始化,原因是源代码又执行了一次魔术函数 wangwu.__init__("王五")
~
释放对象
现在我们需要结束程序了,这样我们需要释放一些内存,对象完成之后能自动释放,(比如我们已经建立了一个mysql的对象)
在类中使用
def __del__(self):
self.p.close()
print "释放资源完成"
##############通过上面的手段我们可以释放盛放对象的内存!
样例如下:
1 #!/usr/bin/python 2 #coding:utf8 3 name = "global" 4 5 class Ren: 6 name = "人" 7 hight = "一人高" 8 wight = "一人重" 9 __money = "我有10块钱" # 私有属性 10 __age = 30 11 12 13 def __init__(self,n = "婴儿"): # 实例化的时候,就会被执行 14 print "初始化中,请稍后……" 15 self.name = n 16 self.p = file('/etc/passwd','r') # 这是一个读操作,初始化完成后,需要关闭 17 18 def run(self): # 类的方法定义,必须有一个行参 19 #有人吧self,写成cls 就是class 20 print self.name # 类中访问自己类的属性。 21 print "跑步" 22 23 def __lie(self): # 私有方法只能被类内部方法使用 24 print "我很欣赏你" 25 26 def say(self): 27 print "说话" 28 self.__lie() # 这个表示是调用的当前自己类里面的私有方法 29 30 31 def get(self,x): # 一般在调用私有属性的时候,都是新建一个方法 32 # 这里用了(self,x)目的是为了使用get("money") 33 # 这样的用法 34 # return self.x # 将私有属性封装起来 35 if x == "money": 36 return self.__money 37 elif x == "age": 38 return self.__age 39 else: 40 return "请正确输入" 41 42 def set(self,x): # 使用这个方法,我们用来修改内置属性 43 self.__age = x 44 45 def moRi(self): 46 return "世界末日" 47 48 mr = classmethod(moRi) # 类的方法,动态的,不实例化类,也能访问这个方法 49 # 从内存角度来说,节省内存,别的方法没有加载 50 51 def __del__(self): # 释放函数,析构函数,当函数调用完成后自动释放 52 self.p.close() # p这个对象的从内存中释放 53 print "释放资源完成" 54 55 56 if __name__ == '__main__': # 这表示如果被别人调用的话,将不执行 57 # 被自己调用,执行 58 59 zhangsan = Ren("张三") # 把Ren类实例化,变成张三 60 print zhangsan.name
显示结果如下:
alex@universe ~/python/OOP $ python cls_Lei_XiGouHanShu.py
初始化中,请稍后……
张三
释放资源完成
alex@universe ~/python/OOP $
如果我们怕忘记
def __del__(self):
self.p.close() # 析构函数忘记加入类里面了
我们可以使用python自带的一个gc模块,垃圾内存回收机制
[python 里面有一个自动的垃圾回收装置。]
python采用垃圾回收机制来清理不再使用的对象;python提供gc模块释放不再使用的对象
python采用“引用计数”的算法方式来处理回收,即:当某个对象在其作用域的不再被其他对象引>用的时候,python就会自动清除对象;
python的函数collect()可以一次收集所有待处理的对象(gc.collect())
用法如下:
1 #!/usr/bin/python 2 #coding:utf8 3 name = "global" 4 import gc # 引入gc模块,用来释放内存垃圾 5 class Ren: 6 name = "人" 7 hight = "一人高" 8 wight = "一人重" 9 __money = "我有10块钱" # 私有属性 10 __age = 30 11 12 13 def __init__(self,n = "婴儿"): # 实例化的时候,就会被执行 14 print "初始化中,请稍后……" 15 self.name = n 16 self.p = file('/etc/passwd','r') # 这是一个读操作,初始化完成后,需要关闭 17 18 def run(self): # 类的方法定义,必须有一个行参 19 #有人吧self,写成cls 就是class 20 print self.name # 类中访问自己类的属性。 21 print "跑步" 22 23 def __lie(self): # 私有方法只能被类内部方法使用 24 print "我很欣赏你" 25 26 def say(self): 27 print "说话" 28 self.__lie() # 这个表示是调用的当前自己类里面的私有方法 29 30 31 def get(self,x): # 一般在调用私有属性的时候,都是新建一个方法 32 # 这里用了(self,x)目的是为了使用get("money") 33 # 这样的用法 34 # return self.x # 将私有属性封装起来 35 if x == "money": 36 return self.__money 37 elif x == "age": 38 return self.__age 39 else: 40 return "请正确输入" 41 42 def set(self,x): # 使用这个方法,我们用来修改内置属性 43 self.__age = x 44 45 def moRi(self): 46 return "世界末日" 47 48 mr = classmethod(moRi) # 类的方法,动态的,不实例化类,也能访问这个方法 49 # 从内存角度来说,节省内存,别的方法没有加载 50 51 # def __del__(self): # 释放函数,析构函数,当函数调用完成后自动释放 52 # self.p.close() # p这个对象的从内存中释放 53 # print "释放资源完成" 54 55 56 if __name__ == '__main__': # 这表示如果被别人调用的话,将不执行 57 # 被自己调用,执行 58 59 zhangsan = Ren("张三") # 把Ren类实例化,变成张三 60 zhangsan.run() 61 zhangsan.run() 62 zhangsan.run() 63 zhangsan.run() 64 zhangsan.run() 65 zhangsan.run() 66 zhangsan.run() 67 print gc.collect() 68 lisi = Ren("李四") # 把Ren类实例化,变成李四 69 lisi.run() 70 lisi.run() 71 lisi.run() 72 lisi.run() 73 lisi.run() 74 lisi.run() 75 print gc.collect() # 显示一下到底还剩下多少内存垃圾,释放完成了后,应该是0.这个做测试比较推荐
输出的结果是:
alex@universe ~/python/OOP $ python cls_Lei_gc_ShiFang.py 初始化中,请稍后…… 张三 跑步 张三 跑步 张三 跑步 张三 跑步 张三 跑步 张三 跑步 张三 跑步 0 初始化中,请稍后…… 李四 跑步 李四 跑步 李四 跑步 李四 跑步 李四 跑步 李四 跑步 0
上面的显示为0,说明所有的内存都已经被释放完毕了。
import gc
gc.collect()
比较好用。
下一讲,是常用内置方法
已经讲了,__init__ , __str__, __del__, 还要讲一些