面向对象 -- 基本语法
2019-01-09 本文已影响0人
__深蓝__
创建类
class 类名:
def 方法名( self [, 参数列表] ):
pass
创建对象
对象变量 = 类名( [ 参数列表 ] )
- 定义一个猫类 Cat
- 定义两个方法 eat 和 drink
- 定义一个猫类的对象 tom
class Cat:
def eat(self):
print("小猫爱吃鱼")
def drink(self):
print("小猫在喝水")
tom = Cat()
print(tom)
<__main__.Cat object at 0x00000000029BF0B8>
Cat()
在内存中创建了Cat类
的对象
- 变量
tom
中保存着该对象
的内存地址,使用对象变量
时,会输出对象在内存中的地址(以16进制表示)
- 通过
对象变量.方法名()
的形式调用方法
tom.drink()
tom.eat()
小猫在喝水
小猫爱吃鱼
- 为猫类定义一个名字属性
class Cat:
def __init__(self, name):
self.name = name # 添加name属性
def eat(self):
print("小猫%s爱吃鱼" % self.name)
def drink(self):
print("小猫%s在喝水" % self.name)
使用
类名()
创建对象时,自动执行以下操作:
- 为
对象
在内存中分配空间- 执行
__init__ 方法
,为对象添加属性
并设置初始值,属性又称数据成员
__init__ 方法
内部,使用self.属性 = 形参
接收外部传递的参数- 在方法中使用
self.属性
来引用属性值
tom = Cat("Tom")
tom.eat()
tom.drink()
小猫Tom爱吃鱼
小猫Tom在喝水
内置方法
方法名 | 类型 | 作用 |
---|---|---|
__del__ |
方法 | 对象被从内存中销毁前,会被 自动 调用 |
__str__ |
方法 | 返回对象的描述信息,print 函数输出使用 |
-
__del__
方法
- 当使用
类名()
创建对象
时,自动调用__init__
方法- 当
对象
被从内存中销毁前,自动调用__del__
方法- 对象的
生命周期
在调用类名()
时开始,在调用__del__
方法后结束- 在对象
生命周期
内,可以访问对象属性
,调用对象方法
-
__str__
方法
- 使用
对象变量
时,默认输出对象
的内存地址
- 利用
__str__
方法,可以自定义输出内容和格式__str__
方法必须返回一个字符串
class Cat:
def __init__(self, name):
self.name = name
def __str__(self):
return "我是小猫:%s" % self.name
tom = Cat("Tom")
print(tom)
我是小猫:Tom
实例演示:绘图板
需求:
- 在400X300的绘图纸上,可以绘制点、直线和圆
- 使用类来抽象上述概念
- 设计类
class Pointer:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return 'point(%d,%d)' % (self.x, self.y)
class Line:
def __init__(self, p1, p2):
self.begin = p1
self.end = p2
def __str__(self):
return 'line((%d,%d), (%d, %d))' % (self.begin.x, self.begin.y
, self.end.x, self.end.y)
class Circle:
def __init__(self, r, point):
self.r = r
self.o = point
def __str__(self):
return 'r:%d, o:(%d, %d))' % (self.r, self.o.x, self.o.y)
实例演示:我爱我家
需求:
- 房子(House):有 户型、总面积 和 家具名称列表
新房子没有任何的家具- 家具(HouseItem):有 名字 和 占地面积,其中,
席梦思(bed) 占地 4 平米
衣柜(chest) 占地 2 平米
餐桌(table) 占地 1.5 平米- 将以上三件家具 添加 到房子中
- 打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表
- 设计类图
- 设计属性和方法
- 在房子类中定义一个
剩余面积
属性,其初始值和总面积相等- 定义
add_item
方法用来向房子中添加家具,添加家具后让
剩余面积 = 剩余面积 - 家具面积
- 创建家具类
class HouseItem:
def __init__(self, name, area):
self.name = name
self.area = area
def __str__(self):
return "[%s] 占地面积 %.2f" % (self.name, self.area)
bed = HouseItem("席梦思", 4)
chest = HouseItem("衣柜", 2)
table = HouseItem("餐桌", 1.5)
print(bed)
print(chest)
print(table)
[席梦思] 占地面积 4.00
[衣柜] 占地面积 2.00
[餐桌] 占地面积 1.50
- 创建房子类
class House:
def __init__(self, house_type, area):
self.house_type = house_type
self.area = area
self.free_area = area
self.item_list = []
def __str__(self):
return ("户型:%s\n总面积:%.2f[剩余:%.2f]\n家具:%s"
% (self.house_type, self.area,
self.free_area, self.item_list))
def add_item(self, item):
print("要添加 %s" % item)
my_home = House("两室一厅", 60)
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
print(my_home)
要添加 [席梦思] 占地面积 4.00
要添加 [衣柜] 占地面积 2.00
要添加 [餐桌] 占地面积 1.50
户型:两室一厅
总面积:60.00[剩余:60.00]
家具:[]
- 实现
add_item
方法
- 判断家具的面积是否超过剩余面积,如果超过提示不能添加这件家具
- 将家具名称追加到家具名称列表中
- 用房子剩余面积 - 家具面积
def add_item(self, item):
print("要添加 %s" % item)
if item.area > self.free_area:
print("%s 的面积太大,不能添加到房子中" % item.name)
return
self.item_list.append(item.name)
self.free_area -= item.area
实例演示:打砖块
需求
- 在
800X400
的屏幕上,有2个大小不等的圆- 判断2个圆是否发生了碰撞
import math
class Pointer:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return 'point(%d,%d)' % (self.x, self.y)
class Circle:
def __init__(self, r, point):
self.r = r
self.o = point
def __str__(self):
return 'r:%d, o:(%d, %d))' % (self.r, self.o.x, self.o.y)
def func(self, a):
a.func()
if __name__ == '__main__':
c1 = Circle(40, Pointer(100, 100))
c2 = Circle(50, Pointer(160, 160))
x = c1.o.x - c2.o.x
y = c1.o.y - c2.o.y
z = math.sqrt(x ** 2 + y ** 2) # z = (x**2 + y**2)**0.5
if z <= c1.r + c2.r:
print('发生碰撞')
else:
print('没有碰撞')
实例演示:士兵突击
需求
- 士兵
许三多
有一把AK47
- 士兵可以
开火
枪
能够发射
子弹- 枪
装填
子弹 — 增加子弹数量
- 设计枪类
属性
- model:型号
- bullet_count:子弹数量
shoot方法
- 判断是否有子弹,没有子弹无法射击
- 使用 print 提示射击,并且输出子弹数量
class Gun:
def __init__(self, model):
self.model = model # 枪的型号
self.bullet_count = 0 # 子弹数量
def add_bullet(self, count):
self.bullet_count += count
def shoot(self):
if self.bullet_count <= 0:
print("没有子弹了...")
return
self.bullet_count -= 1
print("%s 发射子弹[%d]..." % (self.model, self.bullet_count))
ak47 = Gun("ak47")
ak47.add_bullet(50)
ak47.shoot()
- 设计士兵类
属性
- name:姓名
- gun:枪,每个新兵都没有枪,初始值设置为
None
fire 方法
- 判断是否有枪,没有枪没法冲锋
- 喊一声口号
- 装填子弹
- 射击
class Soldier:
def __init__(self, name):
self.name = name
self.gun = None
def fire(self):
if self.gun is None: # 判断是否有枪
print("[%s] 还没有枪..." % self.name)
return
print("冲啊...[%s]" % self.name) # 喊一声口号
self.gun.add_bullet(50) # 装填子弹
self.gun.shoot() # 射击
身份运算符
身份运算符
用于比较两个对象的内存地址
是否一致,即是否指向同一对象- 在 Python 中针对
None
比较时,建议使用is
判断
运算符 | 描述 | 实例 |
---|---|---|
is | 判断两个变量是否指向同一对象 | x is y,类似id(x) == id(y)
|
is not | 判断两个变量是否指向不同对象 | x is not y,类似id(a) != id(b)
|
is 与 == 区别:
is
用于判断两个变量引用的对象
是否为同一个==
用于判断两个变量引用的值
是否相等
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> b is a
False
>>> b == a
True
- end -