python基础——6
目录
构造函数__init__() (init前后分别是两个下划线)
面向对象编程
面向对象是将数据和操作数据的方法封装到对象中
面向过程考虑的是程序的逻辑流程,适合开发小程序
面向对象思维,适合开发大规模程序
类的定义
类也称为类对象,类是抽象的,是对象的模板
类的结构:
方法:由同一个类创建的所有对象共享(行为)
属性:每个对象维持自己的属性(状态)
class Student: #类名首字母大写,多单词驼峰原则
def __init__(self,name,score): #这是构造函数,self必须是第一个参数
self.name=name
self.score=score
def say_score(self):
print("{0}的分数是{1}".format(self.name,self.score))
s1=Student("abc",10) #调用的时候,默认把当前的地址赋值给self,之后的“abc”和10依次赋值给name和score
s1.say_score() #调用say_score函数时,参数是self,即上一步的地址,因此self.name和self.score就是之前赋值的"abc"和10
构造函数__init__() (init前后分别是两个下划线)
对象包含:
1.id(identity识别码)
2.type(对象类型)
3.value(对象的值)
(1)属性(attribute)
(2)方法(method)
创建对象(无需重新定义该方法)后,首先通过__init__()初始化创建后的对象,无返回值
__init__()的要点:
1.名称固定
2.第一个参数固定为self,类里面定义的方法第一个参数都是self,self指的就是刚刚创建好的实例对象
3.构造函数用来初始化实例对象的实例属性
self.name=name
self.score=score #初始化实例属性
实例属性相应的要在构造函数的形参中写出来, def __init__(self,name,score)
4.通过类名调用构造函数 s1=Student("abc",10)
5.,__init__()方法:初始化创建好的实例对象,初始化指的是给实例属性赋值
6.__new__()方法:用于创建对象,一般无需重定义该方法
7.python中的self相当于C++的指针,self必须是构造函数的第一个参数,类里面定义的方法第一个参数都是self,名字可以不叫self,但是一般遵循规则取self
8.如果__init__()只有self一个形参,在类中也可以不写这个构造函数
实例属性的内存分析
实例属性是从属于实例对象的属性,也称为实例变量
1.实例属性一般在__init__()方法中定义:
self.实例属性名=初始值
2.在本类的其他实例方法中也通过self进行访问:
self.实例属性名
3.创建实例对象后,通过实例对象进行访问:
obj01=类名()#创建对象,调用__init__()方法初始化属性
obj01.实例属性名=值 #新创建和初始化后的对象可以进行该操作,可以给原有属性赋值,也可以新加属性(但是新加属性在类生成的其他对象中是没有的!)
下面我们重新分析本篇最开始的那段代码:
class Student: #定义类
def __init__(self,name,score): #定义构造函数,此时会产生一个内存地址,self相当于地址id,指当前的实例对象,用于指向该地址从而调用里面的属性和方法,name和score是地址里面的实例属性,后面定义的def say_score(self)是地址里面的实例方法
self.name=name #定义实例属性
self.score=score
def say_score(self): #定义实例方法
print("{0}的分数是{1}".format(self.name,self.score))
s1=Student("abc",10) #通过类名调用构造函数,其实在调用过程中首先通过__new__()方法创建对象,之后通过__init__()方法初始化对象。类相当于模具,会产生一些相似的对象,这时一个新对象就产生了。在这个新对象中,不只包含之前定义的实例属性,还有定义的实例方法(实例方法本质上也是实例属性),以及后续可以增加新的实例属性
s1.say_score()
实例方法
实例方法也是从属于实例对象的方法
定义格式:
def 方法名(self,[,形参列表]):
函数体
调用格式:
对象.方法名([实参列表])
要点:
1.第一个参数必须是self,self指
2.调用实例方法时,不需要给self传参,self由解释器自动传参
函数和方法的区别:
1.本质一样
2.方法从属于特定实例对象,通过对象来调用
3.方法需要传递self
其他操作
1.dir(obj)可以获得对象的所有属性和方法
2.obj.__dic__对象的属性字典
3.pass空语句
4.isinstance(对象,类) 判断对象是不是属于指定类
类对象
当解释器执行class时会创建一个类对象
class相当于一个模具类,类型为type
class Student 实际上创建了一个名为Student的类对象,可以赋值给其他对象,比如说Stu=Student
之后就可以通过Stu()调用该类
类属性和类方法
类属性:
类属性从属于类对象,也叫类变量,可以被所有实例对象共享
类属性定义方式:
class 类名:
类变量名=初始值
在类中和类外面,可以通过 “类名.类变量名”来读写
类方法:
类方法格式:
@classmethod
def 类方法名cls[,形参列表]: #def s1(cls,...):
函数体
1.第一个cls必须有,它指的就是类对象本身
2.调用类方法格式:
类名.类方法名(参数列表)
参数列表中不需要给cls传值
3.类方法中访问实例属性和实例方法会报错,类方法就是操作类属性的
4.子类继承父类方法时,传入cls是子类对象,不是父类对象
静态方法:
与类对象无关,与正常函数没有区别,只是放到类里面,通过类调用
格式:
@statticmethod
def 静态方法名([形参列表])
函数体
静态方法也可以操作类属性
静态方法不能调用实例属性和实例方法
__del__()方法(析构函数)和垃圾回收机制
实现销毁对象的操作,释放对象占用的资源
当对象没有被引用(引用计数为0)时,由垃圾回收器调用__del__()方法,当程序结束时引用结束,就会自动调用该方法
一般不需要重新定义析构方法,系统会自动通过__del__()方法
可以通过 “del 对象名”这个语句删除对象,会调用__del__()方法
__call__()方法和可调用对象