动态扩展类与实例:
Python作为一种动态语言,除了可以在定义类时定义属性和方法外,还可以动态地为已经创建的对象绑定新的属性和方法。
在给对象绑定方法时,需要使用types模块中的MethodType方法,其第一个参数是要绑定的函数名,第二个参数是绑定的对象名。
给一个对象绑定方法后,只能通过该对象调用该方法,其他未绑
定该方法的对象则不能调用。例如,没有为stu2对象绑定SetName
方法,因此,如果将第15行前面的注释符取消,则程序运行时系
统会报错。
而第12行为Student类绑定了SetSno方法,则Student类中的所有实
例对象都有该方法。
构造方法:
构造方法是Python类中的内置方法之一,它的方法名为__init__,在创建一个类对象时会自动执行,负责完成新创建对象的初始化工作。
析构方法:
析构方法是类的另一个内置方法,它的方法名为__del__,在销毁一个类对象时会自动执行,负责完成待销毁对象的资源清理工作,如关闭文件等。
提示:类对象销毁有如下三种情况:
(1)局部变量的作用域结束。
(2)使用del删除对象。
(3)程序结束时,程序中的所有对象都将被销毁。
继承的概念:
继承允许开发者基于已有的类创建新的类。
如果一个类C1通过继承已有类C而创建,则将C1称作子类(sub class),将C称做基类、父类或超类(base class、super class)。
子类会继承父类中定义的所有属性和方法,另外也能够在子类中增加新的属性和方法。
如果一个子类只有一个父类,则将这种继承关系称为单继承;如果一个子类有两个或更多父类,则将这种继承关系称为多重继承。
子类的定义:
方法重写和鸭子类型:
方法重写,是指子类可以对从父类中继承过来的方法进行重新定义,从而使得子类对象可以表现出与父类对象不同的行为。
在鸭子类型中,关注的不是对象所属的类,而是一个对象能够如何使用。
在Python中编写一个函数,传递实参前其参数的类型并不确定,在函数中使用形参进行操作时只要传入的对象能够支持该操作程序就能正常执行。
super方法:
super方法用于获取父类的代理对象,以执行已在子类中被重写的父类方法,其语法格式为:super([类名,[,对象名或类名]])
super方法有两个参数:
第一个参数是要获取父类代理对象的类名。
第二个参数如果传入对象名,则该对象所属的类必须是第一个参数
指定的类或该类的子类,找到的父类对象的self会绑定到这个对象上;
如果传入类名,则该类必须是第一个参数指定的类的子类。
在一个类A的定义中调用super方法时,可以将两个参数都省略,此
时,super()等价于super(A, self),即获取A的父类代理对象,且获取
到的父类代理对象中的self绑定到当前A类对象的self上。
内置函数isinstance、issubclass、type:
isinstance:
用于判断一个对象所属的类是否是指定类或指定类的子类。
issubclass:
用于判断一个类是否是另一个类的子类。
type:
用于获取一个对象所属的类。
如果我们要判断一个对象的类型是否是指定类或该类的子类,则可以使用isinstance函数。
如果我们要判断一个对象的类型是否是指定类,则可以使用“type(对象名)==类名”的方式。
类方法和静态方法:
类方法是指使用@classmethod修饰的方法,其第一个参数是类本身(而不是类的实例对象)。
类方法的特点是既可以通过类名直接调用,也可以通过类的实例对象调用。
静态方法是指使用@staticmethod修饰的方法。
与类方法相同,静态方法既可以直接通过类名调用,也可以通过类的实例对象调用。
与类方法不同的地方在于,静态方法中没有类方法中的第一个类参数。
可变类型和不可变类型:
可变类型:
即可以对该类型对象中保存的元素值做修改,如列表、字典都是可变类型。
不可变类型:
即该类型对象所保存的元素值不允许修改,只能通过给对象整体赋值来修改对象所保存的数据。但此时实际上就是创建了一个新的不可变类型的对象、而不是修改原对象的值,如数字、字符串、元组都是不可变类型。
提示:可变类型的对象和不可变类型的对象的区别在于是否可修改对象中的元素值。对于可变类型的对象,如果对可变类型对象中的元素做修改,则不会创建新对象;而如果直接对其赋值,则也会创建一个新的对象。
通过deepcopy函数实现列表元素复制:
列表元素的查找、插入和删除:
查找:
通过列表中的index方法可以根据指定值查找第一个匹配的列表元素的位置。
>>ls=[1,3,5,3] #创建列表对象,并赋给ls变量
>>print('ls值为3的元素第一次出现的位置为:',ls.index(3))
out:
ls值为3的元素第一次出现的位置为: 1
插入:
通过列表中的insert方法可以将一个元素插入到列表的指定位置,语法格式为:
ls.insert(index,x)
其作用是将元素x插入到ls列表下标为index的位置上。
>>lst=[1,2,2,4]
>>lst.insert(2,100)
>>lst
Out[68]:
[1, 2, 100, 2, 4]
在列表的最后添加新元素:
ls.append(x)
删除:
使用del语句可以删除某个变量或列表中的某个元素。
>>ls=[1,3,5,3]
>>del ls[3]
>>ls
Out[62]:
[1, 3, 5]
如果要删除列表中的连续多个元素,也可以截取列表中的连续多个元素并将其赋为空列表。
>>ls=[1,3,5,3]
>>ls[2:]=[]
>>ls
Out[65]:
[1, 3]
统计列表中元素出现的次数:
法一:
>>ls=[1,3,5,3]
>>ct=0
>>for x in range(len(ls)):
if ls[x]==3:
ct=ct+1
>>print('共%s个3' %(ct))
out:
共2个3
法二:
>>ls=[1,3,5,3]
>>print('ls列表中共%s个3' %(ls.count(3)))
out:
ls列表中共2个3