类、对象和面向对象的编程
类:一堆函数的集合,是可以实例化出对象的模具,是具有共性的一类事物的统一描述
实例化: 对象 = 类() t = turtle.Pen()
对象:是类实例化出的实体,对象实实在在存在,完成具体工作
面向对象:程序员反复修改优化类,类实例化出对象,对象调用类里的函数来执行具体的操作
哺乳动物类是动物类的子类,是在动物的基础上多了喂奶的功能。
猫是哺乳动物的子类,在哺乳动物的基础上多了捉老鼠的功能
类具有继承关系,子类将具有自身和父类的功能
类的定义
class 类名(父类名):
pass
python类的继承是直接类名后括号写上继承的父类,不像Java那样还要extends
一般类的定义括号都是空的,继承会在括号里写上父类
class Animals:
pass
class Mammals(Animals):
pass
class Cats(Mammals):
pass
__init__函数就是构造函数
但__init__函数并不是一定要有的,可以没有
class Animals(): def breathe(self): print('breathing') def move(self): print('moving') def eat(self): print('eating food') class Mammals(Animals): def breastfeed(self): print('feeding young') class Cats(Mammals): def __init__(self, spots): self.spots = spots def catch_mouse(self): print('catch mouse') def left_foot_forward(self): print('left foot forward') def left_foot_backward(self): print('left foot backward') def dance(self): self.left_foot_forward() self.left_foot_backward() self.left_foot_forward() self.left_foot_backward() kitty = Cats(10) print(kitty.spots) kitty.dance() kitty.breastfeed() kitty.move()
运行结果:
类变量和实例变量
在python的类中,类的属性有两种作用域:类变量,实例变量。
类似于java和c++中的static变量与一般变量的区别。类变量属于整个class所共享,而实例变量则仅仅属于特定对象实例。
类变量是定义在类中的方法外的,通过类名.变量名访问
实例变量是定义在类中的方法里面的,以“self.变量名”的方式定义的变量,只能通过对象名访问,无法通过类名访问。
注意类变量的定义是以“self.变量名”的方式定义,先用先定义,没有那种提前声明
python类的成员变量都是在__init__()方法中定义的,如下面的self.name和self.add,在外面也可以访问,像通过下面的clang.num和clang.add
而say方法中定义的self.catalog和self.x, 是只对say方法管用,类中的其他方法不能使用,也不能通过类名.变量名来访问
class CLanguage: num = 1 def __init__(self): self.name = "C语言中文网" self.add = "http://c.biancheng.net" # 下面定义了一个say实例方法 def say(self): self.catalog = 13 self.x = self.name print(CLanguage.num) clang = CLanguage() print(clang.name) print(clang.add)
类的私有属性和私有方法
以两个下划线开头的属性和方法为私有属性和方法,不能在类地外部调用
__private_method:,在类的内部调用 self.__private_methods
class JustCounter: __secretCount = 0 # 私有变量 publicCount = 0 # 公开变量 def count(self): self.__secretCount += 1 self.publicCount += 1 print(self.__secretCount) counter = JustCounter() counter.count() counter.count() print(counter.publicCount) print counter.__secretCount # 报错,实例不能访问私有变量
class Cup: #构造函数,初始化属性值 def __init__(self,capacity,color): #私有属性,只需要在属性名字前加__ self.__capacity=capacity self.color=color #私有方法,只需要在方法名前加__ def __retain_water(self): print("杯子颜色:"+self.color+",杯子容量:"+self.__capacity+",正在装水.") def keep_warm(self): print("杯子颜色:"+self.color+",杯子容量:"+self.__capacity+",正在保温.") currentCup=Cup('50ml','紫色') currentCup.__retain_water() #外部调用失败,因为__retain_water()方法是私有的
类定义中的特殊方法
特殊方法也称为魔术方法(magic method)
在类定义中实现一些特殊方法,可以方便地使用python中的一些内置操作
所有特殊方法的名称以两个下划线(__)开始和结束
__init__(self,...)就是一个特殊方法,称为对象构造器
起到一个构造函数的作用
析构器
__del__(self,...)
当你销毁一个对象的时候,它就会被自动地调用
from os.path import join class Fileobject: #给文件对象进行包装从而确认在删除时文件流关闭 def __init__(self,filepath='~',filename='sample.txt'): #读写模式打开一个文件 self.file = open(join(filepath,filename),'r+') def __del__(self): self.file.close() del self.file
算数运算符
反运算
大小比较
字符串操作
也就是说这些magic method是默认存在的,它对应的某个功能,比如说比较大小,在你使用的时候,如 if a>b:
python其实会默认调用__eq__这个方法,他是内置的,而如果你想重定义比较大小的规则的话,你就可以在类里面重写__eq__方法