学习资料: https://www.runoob.com/python3/python3-class.html https://blog.csdn.net/zhuizhuzijidemenglsy/article/details/78364949 背景知识: 面向对象的语言的四大特征:
抽象:抽象指忽略一些我们目标所需之外的东西。比如:户籍管理系统中只管住址,身份证号等相关信息,而学习成绩,月开销等无关信息忽略。封装:是对象和类概念的主要特性。封装是把过程和数据包围起来,只提供一个接口供用户使用,这样提高了代码的安全性,以及使用的简便性。继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。派生类继承了基类的成员方法和变量,并且可以在类里增加自己的特性函数变量实现特定功能:比如:基类是圆,派生出圆柱类。这个过程就是类继承。多态:多态是指允许不同类对象对同一消息做出反应,同一消息被不同的对象响应可以造成不同的结果。比如同样的选择编辑-粘贴操作,在字处理程序和绘图程序有不同结果。面向对象语言的一些基本概念:
类(Class): 即具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。局部变量:定义在方法中的变量,只作用于当前实例的类。实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。实例化:创建一个类的实例,类的具体对象。对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。引入: Python是面向对象的编程语言,因此在Python中创建类与对象很容易。Python加入了类机制。Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。对象可以包含任意数量和类型的数据。
1.类定义与类对象
定义一个类: class 类的名字: 描述1 描述2 ... 描述n 类对象支持两种操作:属性引用和实例化。属性引用使用的标准语法:obj.name。类对象创建后,类命名空间中所有的命名都是有效属性名,可以通过类名访问其属性。 例: class subjects: i='Math','Chinese','English' def f(self): return 'major_subjucts' x=subjects()#实例化类 >>> print(x.i) ('Math', 'Chinese', 'English')#访问类的属性 >>> print(x.f()) major_subjucts 在类实例化(如:x=myclass())时会自动调用一个特殊构造方法:__init__() def __init__(self): self.data=[]init() 方法还可以有参数,参数通过 init() 传递到类的实例化操作上。 例:
class Complex: def __init__(self, realpart, imagpart): self.r = realpart self.i = imagpart x = Complex(3.0, -4.5) print(x.r, x.i) #3.0 -4.5 self代表类的实例,而非类。类的方法与普通的函数只有一个特别的区别:它们必须有一个额外的第一个参数名称, 按照惯例最好是 self。 class Test: def prt(self): print(self) print(self.__class__) t = Test() t.prt() #__main__.Test instance at 0x100771878> __main__.Test从结果可以看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则代表类。我们把self 换成 runoob 也是可以正常执行的。
2.类的方法 在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。 例:
class people: name = '' age = 0 weight = 0 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age)) p = people('runoob',10,30) p.speak() #runoob 说: 我 10 岁。3.继承
如何定义派生类(可单继承也可多重继承): class 派生类名字(基类名1,基类名2,...,基类名n) 描述1 描述2 ... 描述n注意:圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,方法在子类中未找到时,Python从左到右查找基类中是否包含方法。基类名必须与派生类定义在一个作用域内。
除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用: class DerivedClassName(modname.BaseClassName):例:
class people: name = '' age = 0 weight = 0 def __init__(self,n,a,w): self.name = n self.age = a self.weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age)) #单继承示例 class student(people): grade = '' def __init__(self,n,a,w,g): #调用基类的构函 people.__init__(self,n,a,w) self.grade = g #覆写基类的方法 def speak(self): print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade)) #定义另一个类,多重继承之前的准备 class speaker(): topic = '' name = '' def __init__(self,n,t): self.name = n self.topic = t def speak(self): print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic)) #多重继承 class sample(speaker,student): a ='' def __init__(self,n,a,w,g,t): student.__init__(self,n,a,w,g) speaker.__init__(self,n,t) test = sample("Tim",25,80,4,"Python") test.speak() #我叫 Tim,我是一个演说家,我演讲的主题是 Python4.方法重写 如果派生类中需要基类的构造方法就需要显式地调用父类的构造方法或不重写父类的构造方法(这样实例化子类时,会自动调用基类定义的 init())。如果重写了__init__ ,实例化派生类,就不会调用基类定义的 init。如果重写了__init__ 时,要继承父类的构造方法,可以使用 super 关键字:super(子类,self).__init__(参数1,参数2,....)或父类名称.__init__(self,参数1,参数2,...)
5.类属性与方法
类的私有属性:两个下划线开头__f,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__f。类的私有方法:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。内部使用:self.__private_methods。类的专有方法:init : 构造函数,在生成对象时调用 del : 析构函数,释放对象时使用 repr : 打印,转换 setitem : 按照索引赋值 getitem: 按照索引获取值 len: 获得长度 cmp: 比较运算 call: 函数调用 add: 加运算 sub: 减运算 mul: 乘运算 truediv: 除运算 mod: 求余运算 pow: 乘方