美文网首页
面向对象 -- 基本语法

面向对象 -- 基本语法

作者: __深蓝__ | 来源:发表于2019-01-09 11:32 被阅读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 函数输出使用
    • __del__方法
    • 当使用 类名() 创建对象时,自动调用 __init__ 方法
    • 对象被从内存中销毁前,自动调用 __del__ 方法
    • 对象的生命周期在调用 类名() 时开始,在调用 __del__ 方法后结束
    • 在对象生命周期内,可以访问对象属性,调用对象方法
    • __str__方法
    • 使用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]
    家具:[]
    
    • 实现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 -

    相关文章

      网友评论

          本文标题:面向对象 -- 基本语法

          本文链接:https://www.haomeiwen.com/subject/fxudrqtx.html