(1)面向对象(Object Oriented)是软件开发方法,一种编程范式.
(2)面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物
(3)面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式
(4)面向对象的特点: 封装, 继承, 多态
案例: 解决吃啤酒鸭的问题
方式一(面向过程): 方式二(面向对象):
1) 养鸭子 1) 找个卖啤酒鸭的商贩
2)鸭子长成 2) 掏钱买啤酒鸭
3)杀鸭子 3) 吃啤酒鸭
4)烹饪
5)吃啤酒鸭
类和对象是面向对象编程中的2个重要概念. 其中对象是面向对象编程的核心, 在使用对象的过程中,为了将具有共同特征和行为的一组对象定义,提出另外一个概念---类.
◆ 人以类聚,物以群分
◆ 具有相似内部状态和运动规律的实体的集合(或统称为抽象)
◆ 具有相同属性和行为事物的统称
◆ 类是抽象的, 一个类可以找到多个对象
◆ 某一个具体事物的存在,在现实世界中可以是看得见摸得着的
◆ 可以是直接使用的
(1) 汽车 类
奔驰汽车 类
张三开的那辆奔驰汽车 对象
(2) 水果 类
苹果 类
红富士苹果 类
我手上拿着的苹果 对象
类Class是由3部分组成的:
①类的名称: 类名 比如: 人Person
②类的属性:一组数据 比如: 姓名name, 年龄age,身高height等
③类的方法:允许进行的操作的方法 比如: 跑run, 跳skip等
三.定义类
3.1 定义格式:
class 类名:
方法列表
3.2 定义形式
- demo: 定义一个Hero类
-
- #旧式经典类定义
- class Hero:
- def info(self):
- print('英雄所见略同')
-
- #新式类定义
- class Hero(object):
- def info(self):
- print('英雄所见略同')
注意:
(1) object是Python里所有类的最顶级父类
(2) 类名按照大驼峰命名法命名
(3) info是一个实例方法,第一个参数一般是self表示实例对象本身;也可以将self换为其他的名字, 其作用是一个变量,这个变量指向了实例对象
4.1 创建对象的格式为:(实例化对象)
对象名1=类名()
对象名2=类名()
4.2 创建对象Demo
- class Hero(object):
- '''定义一个英雄类,可以移动和攻击'''
- def move(self):
- '''实例方法'''
- print('正在前往事发地点....')
-
- def attack(self):
- '''实例方法'''
- print('发出了一招强有力的普通攻击')
- # 实例化一个对象
- t=Hero()
-
- # 给对象添加属性及相应的属性值
- t.name='泰达米尔'
- t.hp=2600 #生命值
- t.atk=450 #攻击力
- t.armor=200 #护甲值
-
- # 格式化输出
- print('英雄: %s的生命值: %d' %(t.name,t.hp))
- print('英雄: %s的攻击力: %d' %(t.name,t.atk))
- print('英雄: %s的护甲值: %d' %(t.name,t.armor))
- # 调用方法
- t.move()
- t.attack()
- class Hero(object):
- '''定义一个英雄类,可以移动和攻击'''
- def move(self):
- '''实例方法'''
- print('正在前往事发地点....')
-
- def attack(self):
- '''实例方法'''
- print('发出了一招强有力的普通攻击')
- def info(self):
- print('英雄: %s的生命值: %d' % (self.name, self.hp))
- print('英雄: %s的攻击力: %d' % (self.name, self.atk))
- print('英雄: %s的护甲值: %d' % (self.name, self.armor))
- # 实例化一个对象
- t=Hero()
-
- # 给对象添加属性及相应的属性值
- t.name='泰达米尔'
- t.hp=2600 #生命值
- t.atk=450 #攻击力
- t.armor=200 #护甲值
-
- # 调用方法
- t.info()
- t.move()
- t.attack()
-
- class Hero(object):
- '''定义一个英雄类,可以移动和攻击'''
- def __init__(self): #self代表实例化对象
- #赋值 没有参数
- self.name='泰达米尔'
- self.hp=2600 #生命值
- self.atk=450 #攻击力
- self.armor=200 #护甲值
- def move(self):
- '''实例方法'''
- print('正在前往事发地点....')
-
- def attack(self):
- '''实例方法'''
- print('发出了一招强有力的普通攻击')
- def info(self):
- print('英雄: %s的生命值: %d' % (self.name, self.hp))
- print('英雄: %s的攻击力: %d' % (self.name, self.atk))
- print('英雄: %s的护甲值: %d' % (self.name, self.armor))
- # 实例化一个对象
- t=Hero()
-
- # 调用方法
- t.info()
- t.move()
- t.attack()
- class Hero(object):
- '''定义一个英雄类,可以移动和攻击'''
- def __init__(self,name,hp,attack,armor):
- #属性初始化 有参数
- self.name=name
- self.hp=hp #生命值
- self.atk=attack #攻击力
- self.armor=armor #护甲值
- def move(self):
- '''实例方法'''
- print('正在前往事发地点....')
-
- def attack(self):
- '''实例方法'''
- print('发出了一招强有力的普通攻击')
- def info(self):
- print('英雄: %s的生命值: %d' % (self.name, self.hp))
- print('英雄: %s的攻击力: %d' % (self.name, self.atk))
- print('英雄: %s的护甲值: %d' % (self.name, self.armor))
- # 实例化一个对象
- t=Hero('泰达米尔',2600,450,200)
-
- # 调用方法
- t.info()
- t.move()
- t.attack()
- 注意:
- (1)在类的内部获取属性和实例方法,通过self获取
- (2)在类的外部获取属性和实例方法,通过对象名获取
- (3)如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址
- (4)但是实例方法是所有对象共享的,只占有一份内存空间.类会通过self来判断是哪个对象调用了实例方法
str 如果一个类中定义了__str__方法,在打印对象时,默认输出该方法的返回值,没有定义会返回对象的地址
- class Hero(object):
- '''定义一个英雄类,可以移动和攻击'''
- def __init__(self,name,hp,attack,armor):
- self.name=name
- self.hp=hp #生命值
- self.atk=attack #攻击力
- self.armor=armor #护甲值
- def move(self):
- '''实例方法'''
- print('正在前往事发地点....')
- def attack(self):
- '''实例方法'''
- print('发出了一招强有力的普通攻击')
- def __str__(self):
- return '英雄<%s>数据: 生命值 %d, 攻击力 %d, 护甲值 %d' % (self.name, self.hp,self.atk,self.armor)
-
- # 实例化一个对象
- t=Hero('泰达米尔',2600,450,200)
- g=Hero('盖伦',4200,260,400)
- print(t)
- print(g)
-
-
- 返回值:
- 英雄<泰达米尔>数据: 生命值 2600, 攻击力 450, 护甲值 200
- 英雄<盖伦>数据: 生命值 4200, 攻击力 260, 护甲值 400
析构方法,删除无用的内存对象(当程序结束会自动自行析构方法)
- class Dog(object):
- def __init__(self,name):
- self.name =name
- print("__init__方法被调用")
- def __del__(self):
- print("__del__方法被调用")
- print("python解释器开始回收%s对象了" % self.name)
- p = Dog('Bob')
- del p
-
-
-
- 返回结果:
- __init__方法被调用
- __del__方法被调用
- python解释器开始回收Bob对象了
- class Dog:
- '''定义一个Dog类'''
- #初始化方法
- #创建完对象后会自动被调用
- def __init__(self,name,age,skill):
- self.name=name
- self.age=age
- self.skill=skill
- def __str__(self):
- return '%s,年龄%d岁,技能是:"%s"' %(self.name,self.age,self.skill)
- if __name__=='__main__':
- #创建对象
- a = Dog('大黄狗', 5, '汪汪叫')
- print(a)
- b = Dog('大黑狗', 3, '呲牙咧嘴')
- print(b)
- c = Dog('大白狗', 1, '夹着尾巴跑')
- print(c)
- 大黄狗,年龄5岁,技能是:"汪汪叫"
- 大黑狗,年龄3岁,技能是:"呲牙咧嘴"
- 大白狗,年龄1岁,技能是:"夹着尾巴跑"