Python面向对象(二)—类和对象
1.类:一个抽象的概念,即生活中的”类别”。
2.对象:类的具体实例,即归属于某个类别的”个体”。
3.类是创建对象的”模板”。
-- 数据成员:名词类型的状态。
-- 方法成员:动词类型的行为。
4.类与类行为不同,对象与对象数据不同。
一.语法
1.定义类
1.代码
class 类名: """ 文档说明 """ def __init__(self,参数列表): self.实例变量 = 参数 方法成员
2.说明
-- 类名所有单词首字母大写.
-- __init__ 也叫构造函数,创建对象时被调用,也可以省略。
-- self 变量绑定的是被创建的对象,名称可以随意。
2.创建对象(实例化)
变量 = 构造函数 (参数列表)
二.实例成员
1.实例变量
语法:
(1)定义:对象.变量名
(2)调用:对象.变量名
说明:
(1)首次通过对象赋值为创建,再次赋值为修改.
e01 =Enemy()#不建议使用
e01.name = “灭霸”#创建实例变量
e01.name = “小灭霸”#修改实例变量
(2)通常在构造函数(_init_)中创建。
e01 = Enemy(“灭霸”,999)
print(e01.name)
(3)每个对象存储一份,通过对象地址访问。
作用:描述所有对象的共有数据。
__dict__:对象的属性,用于存储自身实例变量的字典。
2.实例方法
1.语法
(1) 定义:def 方法名称(self, 参数列表):
方法体
(2) 调用:对象地址.实例方法名(参数列表)
不建议通过类名访问实例方法
2.说明
(1) 至少有一个形参,第一个参数绑定调用这个方法的对象,一般命名为"self"。
(2) 无论创建多少对象,方法只有一份,并且被所有对象共享。
3.作用:表示对象行为。
class Enemy: def __init__(self, name, atk): # 创建实例变量: self.name = name self.atk = atk def fun01(self): # 创建实例变量(建议写在init方法中) self.hp = 10 #创建变量 e01 = Enemy("灭霸",9999) #修改变量 e01.name = "灭灭" print(e01.name, e01.atk) # 灭灭 9999 print(e01.__dict__) # {'name': '灭灭', 'atk': 9999
3.类成员
类变量
1.语法
(1)定义:在类中,方法外定义变量。
class 类名:
变量名 = 表达式
(2)调用:类名.变量名
不建议通过对象访问类变量
2.说明:
--存储在类中。
--只有一份,被所有对象共享。
作用:描述所有对象的共有数据。
类方法
1.语法
(1)定义:
@classmethod
def 方法名称(cls,参数列表):
方法体
(2)调用:类名.方法名(参数列表)
不建议通过对象访问类方法
2.说明
--至少有一个形参,第一个形参用于绑定类,一般命名为'cls'
--使用@classmethod修饰的目的是调用类方法时可以隐式传递类。
--类方法中不能访问实例成员,实例方法中可以访问类成员。
作用:操作类变量。
class ICBC: """ 工商银行 """ # 类被加载时,类变量被创建. # 通过类变量,表示总行的钱 total_money = 5000000 @classmethod # 调用当前方法时,自动传递类名(类地址).而不是对象地址 def print_total_money(cls): # 表达类的行为,只能操作类变量,不能操作实例变量. print("总行的钱有:%d" % cls.total_money) def __init__(self, name, money): # 通过实例变量,表示支行的钱 self.name = name self.money = money # 从总行中扣除当前支行使用的钱 ICBC.total_money -= money # 创建对象,创建实例变量 i01 = ICBC("天坛支行", 100000) # 访问类变量 # print(ICBC.total_money) # 访问类方法 ICBC.print_total_money() # 自动传递类名,到类方法中. i02 = ICBC("天安门支行", 200000) print(ICBC.total_money)
##总行的钱有:4900000
##4700000
静态方法
1.语法
(1)定义:
@staticmethod
def 方法名称(参数列表):
方法体
(2)调用:类名.方法名(参数列表)
不建议通过对象访问静态方法
2.说明
--使用@ staticmethod修饰的目的是该方法不需要隐式传参数。
--静态方法不能访问实例成员和类成员
3.作用:定义常用的工具函数。
class Vector2: """ 向量 """ def __init__(self, x, y): self.x = x self.y = y @staticmethod # 调用当前方法时,不会自动传递任何信息. def get_right(): return Vector2(0, 1) @staticmethod def get_up(): return Vector2(-1, 0) @staticmethod def get_left(): return Vector2(0, -1) @staticmethod def get_down(): return Vector2(1, 0) # 点 pos01 = Vector2(1, 2) # 通过静态方法,获取向右的方向 right = Vector2.get_right() # 表示 pos01 点向右: 点 + 方向 pos02 = Vector2(pos01.x + right.x, pos01.y + right.y) print(pos02.x, pos02.y) #1 3