目录
1. 类与对象
通过类定义数据类型的属性(数据)和方法(行为),对象是类的具体实体,一般称为“类的实例”。
由一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属性值(不共享状态)。
注:Python 中,类也称为“类对象”,类的实例也称为“实例对象”。
2. 类的定义
语法格式如下:
class 类名:
类体
要点:
1)类名必须符合“标识符”的规则;一般规定,首字母大写,多个单词时使用“驼峰原则”。
2)可在类体中定义属性和方法。属性用来描述数据,方法(即函数)用来描述这些数据相关的操作。
2.1 __init__构造方法
需要定义__init__()构造方法,创建类的实例对象后,用以初始化当前对象的相关属性,无返回值。
要点:
1)构造方法名称必须为:__init__()
2)第一个参数固定,必须为 self,self 即为刚刚创建好的实例对象。
3)构造方法通常用来初始化实例对象的实例属性。
4)通过“类名(参数列表)”来调用构造方法,调用后,将创建好的对象返回给相应的变量。
5)若不定义__init__方法,系统会提供一个默认的__init__方法。
注:创建对象时,系统默认使用__new__()方法(一般无需重定义该方法)。对象创建完成后,__init__()方法初始化创建好的对象,即“给实例属性赋值”。
3. 实例属性、实例方法
3.1 实例属性
实例属性是从属于实例对象的属性,也称为“实例变量”。
1)一般在__init__()方法中通过如下代码定义实例属性:self.实例属性名= 初始值;
2)在本类的其他实例方法中,也通过self 进行访问:self.实例属性名;
3)创建实例对象后,通过实例对象访问实例属性:
obj = 类名() #创建对象,调用__init__()初始化属性
obj.实例属性名= 值 #可以给已有属性赋值,也可以新加属性
3.2 实例方法
实例方法是从属于实例对象的方法。实例方法的定义格式如下:
def 方法名(self [, 形参列表]):
函数体
方法的调用格式如下:对象.方法名([实参列表])
注:
1)定义实例方法时,第一个参数必须为self,self 意指当前的实例对象;
2)调用实例方法时,不需要也不能给self 传参。
3.3 其他操作
1)dir(obj):可以获得对象的所有属性、方法。
2)obj.__dict__ :对象的属性字典。
3)pass:空语句。
4)isinstance(对象,类型):判断“对象”是否为“指定类型”。
#测试类的定义、__init__方法、实例属性、实例方法 等
class Student:
def __init__(self,name,score):
self.name = name #实例属性
self.score = score
def say_score(self): #实例方法
print("{0}的分数为{1}".format(self.name,self.score))
s1 = Student("小贝",60) #s1 是实例对象,自动调用__init__()方法
s1.say_score()
Student.say_score(s1) #系统的实际操作
s1.age = 12 #增加新的属性
print("{0}的年龄是{1}".format(s1.name,s1.age))
print(s1.__dict__) #测试obj.__dict__操作
print(isinstance(s1,Student)) #测试isinstance操作
'''
输出结果:
小贝的分数为60
小贝的分数为60
小贝的年龄是12
{'name': '小贝', 'score': 60, 'age': 12}
True
'''
4. 类对象、类属性、类方法、静态方法
4.1 类对象
类定义格式 “class 类名:” 中,当解释器执行class 语句时,会创建一个类对象。
#测试类对象
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def say_score(self):
print("{0}的分数为{1}".format(self.name,self.score))
st = Student #类也是对象
s1 = st("小贝",50)
s1.say_score()
#输出结果:小贝的分数为50
4.2 类属性
类属性是从属于“类对象”的属性,也称为“类变量”,可为所有实例对象所共享。
定义方式:
class 类名:
类变量名= 初始值
在类中或类外,可通过 “类名.类变量名” 读写类属性。
#测试类属性
class Student:
company = "同福客栈"
count = 0
def __init__(self,name,score):
self.name = name
self.score = score
Student.count += 1
def say_score(self):
print("{0}的公司为{1}".format(self.name,Student.company))
print("{0}的分数为{1}".format(self.name,self.score))
s1 = Student("小贝",60)
s2 = Student("小宝",50)
s1.say_score()
print("一共创建了{0}个Student对象".format(Student.count))
'''
输出结果:
小贝的公司为同福客栈
小贝的分数为60
一共创建了2个Student对象
'''
4.3 类方法
类方法是从属于“类对象”的方法,通过装饰器@classmethod 进行定义,格式如下:
@classmethod
def 类方法名(cls [,形参列表]) :
函数体
注:
1)@classmethod 必须位于方法上面一行;
2)参数列表中,必须包括 cls ,意指“类对象”本身;
3)通过 “类名.类方法名(参数列表)” 调用类方法,不需要也不能给cls 传值;
4)类方法中访问实例属性和实例方法会导致错误。
4.4 静态方法
Python 中允许定义与“类对象”无关的方法,称为“静态方法”。
“静态方法”与模块中定义的普通函数没有区别,只是“静态方法”位于“类的名字空间”中,需要通过“类调用”。
静态方法通过装饰器@staticmethod 进行定义,格式如下:
@staticmethod
def 静态方法名([形参列表]) :
函数体
注:
1)@staticmethod 必须位于方法上面一行;
2)通过 “类名.静态方法名(参数列表)” 调用静态方法;
3)静态方法中访问实例属性和实例方法会导致错误。
#测试类方法、静态方法
class Student01:
company = "同福客栈" #类属性
@classmethod #类方法
def printCompany(cls):
print(cls.company)
Student01.printCompany()
class Student02:
company = "同福客栈"
@staticmethod #静态方法
def add(a,b):
print("{}+{}={}".format(a,b,a+b))
print(Student02.company) #静态方法中访问类属性
return a+b
Student02.add(230,140)
'''
输出结果:
同福客栈
230+140=370
同福客栈
'''
5. __del__方法(析构函数)
__del__方法称为“析构方法”,用于实现对象被销毁时所需的操作。
当对象的引用计数为0时,由垃圾回收器调用__del__方法。
#测试析构函数
class Person:
def __del__(self):
print("销毁对象:{0}".format(self))
p1 = Person()
p2 = Person()
del p2
print("程序结束")
'''
输出结果:
销毁对象:<__main__.Person object at 0x000001B6C05253C8>
程序结束
销毁对象:<__main__.Person object at 0x000001B6C050EE08>
'''
6. __call__方法、可调用对象
定义了__call__方法的对象,称为“可调用对象”,即该对象可以像函数一样被调用。
#测试__call__方法
class SalaryAccount:
'''工资计算类'''
def __call__(self, salary):
yearSalary = salary*12
daySalary = salary//30
hourSalary = daySalary//8
return dict(yearSalary=yearSalary,monthSalary=salary,daySalary=daySalary,hourSalary=hourSalary)
s = SalaryAccount()
print(s(5000))
#输出结果:{'yearSalary': 60000, 'monthSalary': 5000, 'daySalary': 166, 'hourSalary': 20}