面向对象 -- 基本语法

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中保存着该对象的内存地址,使用print输出对象变量时,会输出对象在内存中的地址(以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 函数输出使用
  • 当使用 类名() 创建对象时,自动调用 __init__ 方法
  • 对象被从内存中销毁前,自动调用 __del__ 方法
  • 对象的生命周期在调用 类名() 时开始,在调用 __del__ 方法后结束
  • 在对象生命周期内,可以访问对象属性,调用对象方法
  • 使用print输出对象变量时,默认输出对象内存地址
  • 利用__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]
家具:[]
  • 判断家具的面积是否超过剩余面积,如果超过提示不能添加这件家具
  • 将家具名称追加到家具名称列表中
  • 用房子剩余面积 - 家具面积
  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 -

上一篇下一篇

猜你喜欢

热点阅读