引言:
Python面向对象方面的内容
Python面向对象 python面向对象 本节主要讲述python中的面向对象,先直接阐述要点,再给出代码示例
(可能之后本篇会进行更新)
类的定义与使用 要点:
类的组成
类的帮助信息(可以使用ClassName.__doc__
查看)
类体:
位置参数self
仅仅表示一个位置,换成其他名字也可以,只要在第一个位置即可
表示类的实例本身 ,注意是类的实例,即对象
区分类的函数与普通函数的标志
传参时不必传入self的值,通过对象调用公共方法时,会自动将对象隐式绑定到self参数
注意实例化与赋值的区别,实例化才会调用__init__
方法
在类中定义的为类的变量,使用类名调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 class Fish : "鱼的基类" totalNum = 0 def __init__ (self, name, size ): print ("构造ing..." ) Fish.totalNum += 1 self.name = name self.size = size if __name__ == '__main__' : a = Fish print (id (a)) print (id (Fish)) print (a) print (Fish) print ("--------------------------------分割线---------------------------------------" ) a = Fish("小黄鱼" , 12 ) print (id (a)) print (id (Fish)) print (a) print ("--------------------------------分割线---------------------------------------" ) fish = Fish b = fish("小蓝鱼" , 22 ) print (b) print ("--------------------------------分割线---------------------------------------" ) print (Fish.__doc__) print ("--------------------------------分割线---------------------------------------" ) print (a.totalNum) print (b.totalNum) print (Fish.totalNum)
类的函数与普通函数、类的内置属性、对象属性 要点:
类的函数与普通函数的最大的区别:类的函数有位置参数
类的内置属性直接使用类名调用即可
对象属性使用全局方法使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 """ 类的函数与普通函数 """ class Fish : "鱼的基类" totalNum = 0 def __init__ (self, name, size ): print ("构造ing..." ) Fish.totalNum += 1 self.name = name self.size = size """ def eat(): print("我想吃东西...") # 不加self会报错!!eat() takes 0 positional arguments but 1 was given """ def hungry (abbccd ): print ("我想吃东西..." ) def normalFunction (): print ("这是普通的方法" ) if __name__ == '__main__' : normalFunction() c = Fish("小紫鱼" , 5 ) c.hungry() d = Fish("小红鱼" , 9 ) Fish.hungry(d) print ("--------------------------------分割线---------------------------------------" ) print (Fish.__dict__) print (Fish.__name__) print (Fish.__doc__) print (Fish.__module__) print (Fish.__bases__) print (Fish.__base__) print ("--------------------------------分割线---------------------------------------" ) e = Fish("小绿鱼" , 18 ) print (hasattr (e, 'name' )) print (getattr (e, 'size' )) print (setattr (e, 'name' , '小白鱼' )) print (e.name) print (delattr (e, 'name' ))
python对象销毁(垃圾回收) 要点:
Python 使用了引用计数 这一简单技术来跟踪和回收垃圾。
在 Python 内部记录着所有使用中的对象各有多少引用 。
这个对象的引用计数变为0 时, 它将被垃圾回收。但是回收不是”立即”的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 """ python对象销毁(垃圾回收) """ class Fish : "鱼的基类" totalNum = 0 def __init__ (self, name, size ): Fish.totalNum += 1 self.name = name self.size = size def __del__ (self ): print (self.__class__.__name__ + "被销毁了" ) if __name__ == '__main__' : a = Fish("小黑鱼" , 1 ) b = a c = a del (a) print (1 ) del (b) print (2 ) del (c) print (3 )
打印的结果是:
可以看到,我们创建了三个小黑鱼对象的引用,当全部的引用删除完成后,小黑鱼这个对象本身执行__del__
函数,然后被析构
类的继承 要点:
要继承哪个类,写入括号内,有多个父类用逗号隔开
通过super()
调用父类的方法,注意:super()
是带有括号的 (某些教材使用super(Class, self).xxx
调用,这是python2.x的写法)
子类可以调用父类的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 """ 类的继承 """ class Fish (object ): "鱼的基类" totalNum = 0 def __init__ (self, name, size ): Fish.totalNum += 1 self.name = name self.size = size def __str__ (self ): return str ("FISHINFO>>>" + self.name + "," + str (self.size)) def hungry (self ): print ("我饿了!!" ) class Shark (Fish ): "鲨鱼类" def __init__ (self, name, size, age ): super ().__init__(name, size) self.age = age def __str__ (self ): return super ().__str__() + "," + str (self.age) def eat (self, fish ): if not isinstance (fish, Fish): raise Exception("你不能喂鲨鱼鱼以外的其他东西!" ) print ("大口吃鱼!!" ) if fish.size < self.size: print ("我变大了!" ) self.size += 1 return True else : print ("不行,我吃不掉它,它有" + str (fish.size) + ",我才" + str (self.size)) return False if __name__ == '__main__' : s = Shark("鲨鱼辣椒" , 121 , 3 ) a = Fish("小绿鱼" , 18 ) b = Fish("大白鱼" , 200 ) print (s) s.hungry() s.eat(a) print (s) s.hungry() s.eat(b) print (Shark.__bases__)
类属性与方法 要点:
注意:在python中没有严格意义的访问限制
python中的三种限制级别:
name
公共成员。
_name
私有成员。本类和子类访问。(非强制性 ,python建议。也就是说你依然可以在外部访问它 )
__name
强制性私有成员。只在本类访问。(但你依然可以通过_Classname__name
的方式来蛮横访问 )
保护类型的变量不能用于 from module import *
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 """ 类的私有属性与方法 """ class Fish : "鱼的基类" totalNum = 0 __group = 1 _age = 1 def __init__ (self, name, size ): Fish.totalNum += 1 self.name = name self.size = size def __str__ (self ): return str ("FISHINFO>>>" + self.name + "," + str (self.size) + "," + str (self.__group) + "," + str (self._age)) def __hungry (self ): print ("我想吃东西..." ) def _eat (self ): print ("吃东西" ) if __name__ == '__main__' : a = Fish("小白鱼" , 12 ) print (a) print (a.totalNum) print (a._age) print (a._Fish__group) a._eat() a._Fish__hungry()