1. 类与对象
1.1 类
python中,用关键字 class 定义类。
class 类名:
pass
'''扩展: pass 语句是一个空操作语句,它什么也不做,仅作为一个占位符存在,用于保持代码结构的完整性。'''
类中可以包含若干 属性 和 方法。属性(定义在类中的变量)用于描述对象的特征,方法(定义在类中的函数)用来定义对象的行为。
class Cat:
eye_num=2
tail_num=1
leg_num=4
1.2 类的实例化
实例对象= 类()
class 猫:
eye_num=2
tail_num=1
leg_num=4
狸花猫 = 猫() #类的实例化
print(type(狸花猫)) #输出<class '__main__.猫'>
‘狸花猫’ 是 ‘猫’ 的实例。用type()查看‘狸花猫’的类型为<class '__main__.猫'>,__main__是程序入口,‘猫’是定义的类。
1.3 属性的定义与修改
实例与实例间是相互独立的
class 神:
eye_num=2
tail_num=0
leg_num=2
二郎神=神()
孙悟空=神()
二郎神.eye_num=3
print(二郎神.eye_num) #输出3
print(孙悟空.eye_num) #输出2
修改‘二郎神’的属性,不会影响‘孙悟空’的属性,也不会对‘神’这个类产生影响。
1.4 方法的定义与调用
类的方法用来描述对象的行为,实例对象调用方法 时,Python 会 强制性 地将 实例对象本身 传递给类方法的 第一个参数,一般命名为self(对象)
1.4.1
class 神:
eye_num=2
tail_num=0
leg_num=2
def 信息(self, 姓名,武器, 能力): #self是实例对象本身
self.武器=武器
self.能力=能力
print('%s的武器是%s,精通%s'%(姓名,武器,能力))
二郎神=神() #二郎神 是 神 的实例
齐天大圣=神() #齐天大圣 是 神 的实例
神.信息(二郎神,'杨戬','三尖两刃刀','八九玄功')
神.信息(齐天大圣,'孙悟空','金箍棒','七十二变')
#杨戬的武器是三尖两刃刀,精通八九玄功
#孙悟空的武器是金箍棒,精通七十二变
神.信息(二郎神,'杨戬','三尖两刃刀','八九玄功')
神.信息(齐天大圣,'孙悟空','金箍棒','七十二变')
1.4.2
class 神:
eye_num=2
tail_num=0
leg_num=2
def 信息(self, 姓名,武器, 能力): #self是实例对象本身
self.武器=武器
self.能力=能力
print('%s的武器是%s,精通%s'%(姓名,武器,能力))
二郎神=神() #二郎神 是 神 的实例
齐天大圣=神() #齐天大圣 是 神 的实例
二郎神.信息('杨戬','三尖两刃刀','八九玄功')
齐天大圣.信息('孙悟空','金箍棒','七十二变')
#杨戬的武器是三尖两刃刀,精通八九玄功
#孙悟空的武器是金箍棒,精通七十二变
二郎神.信息('杨戬','三尖两刃刀','八九玄功')
齐天大圣.信息('孙悟空','金箍棒','七十二变')
强制性将实例对象 二郎神 和 齐天大圣 本身传递给类方法self,实际上运行的是:
神.信息(二郎神,'杨戬','三尖两刃刀','八九玄功')
神.信息(齐天大圣,'孙悟空','金箍棒','七十二变')
1.5 __init__方法
__init__方法会在实例化新的对象时 自动调用。
class 神:
eye_num=2
tail_num=0
leg_num=2
def __init__(self):
print('成功创建角色')
def 信息(self, 姓名,武器, 能力): #self是实例对象本身
self.武器=武器
self.能力=能力
print('%s的武器是%s,精通%s'%(姓名,武器,能力))
二郎神=神() #二郎神 是 神 的实例
二郎神.信息('杨戬','三尖两刃刀','八九玄功')
齐天大圣=神() #齐天大圣 是 神 的实例
齐天大圣.信息('孙悟空','金箍棒','七十二变')
#成功创建角色
#杨戬的武器是三尖两刃刀,精通八九玄功
#成功创建角色
#孙悟空的武器是金箍棒,精通七十二变
2. 继承与多态
class A(B) #A继承自B,A是B的子类
A类继承自B类,反过来说,B类派生出了A类。因此A类是B类的子类,B类是A类的父类。子类 A
将 自动获得 B
类中定义的 所有属性与方法。
class B:
pass
class A(B):
pass
a=A()
print(isinstance(a,A))
print(isinstance(a, B))
扩展:isinstance()函数接受两个参数,第一个参数为某个实例对象,第二个参数为某个类,能够检查第一个参数是否是第二个参数的 实例,并返回 True
或 False
。
2.1 子类调用父类方法
子类.方法名
class 生灵:
def 属性(self,name):
self.生命 = 100
self.法力 = 100
self.攻击 = 10
self.防御 = 5
print(f'{name}属性:')
print(f'生命: {self.生命}, 法力: {self.法力}, 攻击: {self.攻击}, 防御: {self.防御}')
class 人(生灵):
pass
张三=人()
张三.属性('张三')
扩展:f-string语法,是一种在字符串中直接嵌入变量或表达式的方式。代码中的f前缀表示这是一个格式化字符串字面量,花括号{}内的内容会被替换为实际的值。
2.2 子类重写父类方法
在子类创建时重写方法,Python 会先检查自身类型中有没有对应方法。
class 生灵:
def 属性(self,name):
self.生命 = 400
self.法力 = 10
self.攻击 = 100
self.防御 = 5
print(f'{name}属性:')
print(f'生命: {self.生命}, 法力: {self.法力}, 攻击: {self.攻击}, 防御: {self.防御}')
class 人(生灵):
pass
class 仙(生灵):
def 属性(self, name): #重写方法
self.生命 = 1000
self.法力 = 1000
self.攻击 = 100
self.防御 = 50
print(f'{name}属性:')
print(f'生命: {self.生命}, 法力: {self.法力}, 攻击: {self.攻击}, 防御: {self.防御}')
class 魔(生灵):
def 属性(self, name): #重写方法
self.生命 = 2000
self.法力 = 500
self.攻击 = 150
self.防御 = 30
print(f'{name}属性:')
print(f'生命: {self.生命}, 法力: {self.法力}, 攻击: {self.攻击}, 防御: {self.防御}')
张三=人()
张三.属性('张三')
李四=仙()
李四.属性('李四')
王五=魔()
王五.属性('王五')
两个方法虽然名字相同,实际完成的任务却不相同。这种现象被称为 多态。