寒假自学(五)

希望所有温柔又可爱的人最后都能幸福❤

今日总结:

代码量 200行
博客量 一篇
所学时间 4小时左右
了解到的知识点 python面向对象封装

明日计划:

早上 python面向对象继承
下午 python面向对象继承
晚上

具体内容:

封装

  1. 封装是面向对象编程的一大特点
  2. 属性方法封装到一个抽象的
  3. 外界使用类创建对象,然后让对象调用方法
  4. 对象方法的细节都被封装类的内部

对象的方法内部,是可以直接访问对象的属性的!

class Person:
    def __init__(self, name, weight):
        self.name = name
        self.weight = weight

    def __str__(self):
        return "我的名字叫 %s 体重是 %.2f 公斤" % (self.name, self.weight)

    def run(self):
        print("%s 爱跑步,跑步锻炼身体" % self.name)
        self.weight -= 0.5

    def eat(self):
        print("%s 是吃货,吃完这顿再减肥" % self.name)
        self.weight += 1


xiaoming = Person("小明", 75.0)

xiaoming.run()
xiaoming.eat()
print(xiaoming)

xiaomei = Person("小美", 45)

xiaomei.eat()
xiaomei.run()
print(xiaomei)
print(xiaoming)
  • 对象方法内部,是可以直接访问对象的属性

  • 同一个创建的多个对象之间,属性互不干扰!

家具案例:

class HouseItem:
    def __init__(self, name, area):
        self.name = name
        self.area = area

    def __str__(self):
        return "[%s] 占地%.2f " % (self.name, self.area)


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):
        if item.area > self.free_area:
            print("%s 的面积太大了无法添加" %item.name)
            return
        self.item_list.append(item.name)
        self.free_area -= item.area
        print("要添加 %s" % item)


bed = HouseItem("席梦思", 40)
chest = HouseItem("衣柜", 19)
table = HouseItem("餐桌", 1.5)

print(bed)
print(chest)
print(table)
# 创建房子对象
my_home = House("两室一厅", 60)
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
print(my_home)

一个对象的属性可以是另外一个类创建的对象

士兵突击演练:

is是判断两个标识符是不是引用同一个对象

is not是判断两个标识符是不是引用不同对象

is用于判断两个变量引用对象是否为同一个

==用于判断引用变量的值是否相等

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("[%s] 没有子弹了..." % self.model)

            return
        self.bullet_count -= 1
        print("[%s] 突突突...[%d]" % (self.model, self.bullet_count))


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()


ak47 = Gun("AK47")
# ak47.add_bullet(50)
# ak47.shoot()

# 创建士兵
xsy = Soldier("肖松月")
xsy.gun = ak47
xsy.fire()
# print(xsy.gun)

python中,并没有真正意义私有

  • 在给属性方法命名时,实际上是对名称做了一些特殊处理,使得外界无法访问到
  • 处理方式:在名称前面加上_类名=>_类名_名称
posted @ 2021-01-07 22:04  DemonSlayer  阅读(63)  评论(0编辑  收藏  举报