Python面向对象

关于对象

世界上具体存在的万事万物都被称为对象

什么是类

拿星座举例,比如水瓶座,水瓶座是一个大,它包含所有在水瓶座日期范围内出生的人。

什么是对象

某个具体存在的人就是一个对象,比如我这个人是水瓶座的,那么我就是水瓶座这个类的对象。

对象是具体的,类是抽象的

水瓶座的这个人是具体的,而这个水瓶座的类是抽象的。为什么说水瓶座这个类是抽象的呢,因为水瓶座是由所有水瓶座的人所共同拥有的一些特征或属性组成的,将这些特征和属性抽取出来放进水瓶座这个大类中。而水瓶座有个方法就是说一些奇奇怪怪的话,那么我上面写的这些奇奇怪怪的话就可以说明我是水瓶座这个类的对象。而我的出生日期就是一个属性,这个属性在水瓶座规定的出生日期范围

所以一个类中包含属性和方法。当然,作为水瓶座的对象也具有水瓶座的属性和方法。

什么是继承

Python中所有的类都继承自objetc类,默认创建的类都会继承object。

如果想要继承一个类,一个子类可以继承多个父类,当继承了一个类后,会拥有父类的全部属性和方法,包括私有属性和私有方法,但不能直接调用,可以通过父类的方法间接调用。  

可以使用super().__方法名__来调用父类的内置方法

类的私有属性和私有方法

类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs

类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods

什么是重写、多态

重写针对的是方法,即在子类中写一个与父类同名的方法。再次调用这个方法时,会按照子类中的方法执行,同样也可以使用super().方法名来调用父类中同名的方法。由此,子类可以灵活的展示自己的属性和方法,这个就叫做多态。由此,面向对象的三大特征就是封装、继承、多态。

self代表本身,cls代表本类

内置__init__函数

# 当对象被创建出来时就自动调用init函数,进行初始化
# 可以将需要的属性定义在里面,对象创建成功后直接使用
def __init__(self, new_name):
    self.name = new_name
    print("我是%s猫,初始化成功!" % self.name)

内置__str__函数

# 当使用print方法打印对象时,会有一段默认的内容输出
# 如果重写了这个方法,内容将会被替换
def __str__(self):
    return "helle Tom"

内置__new__函数

 # 1、创建对象,new方法会被自动调用
 # 2、__new__是为对象在内存中分配空间的内置函数
def __new__(cls, *args, **kwargs):
    print("创建对象,new方法被调用")

内置__del__函数

# 对象从内存中消失才会自动调用del函数
def __del__(self):
    print("%s猫,被删除" % self.name)

实例方法、类方法、静态方法

实例方法:在方法内部需要访问实例属性,实例方法内部可以使用类名.访问类属性

    def start_game(self):
        print("%s 开始游戏了" % self.game_name)

类方法:方法内部只需要访问类属性,使用修饰符@classmethod

    @classmethod
    def show_top_score(cls):
        print("历史最高分是:%d" % cls.top_score)

静态方法:方法内部,不需要访问实例属性和类属性,使用修饰符@staticmethod,不需要传递self参数,可以直接用类名.静态方法调用

    @staticmethod
    def show_help():
        print("这里是帮助信息")

如果方法内部即需要访问实例属性又需要访问类属性,应该定义实例方法

因为,类只有一个,在实例方法内部可以使用类名.访问类属性

实例方法、类方法、静态方法的应用

class Game(object):
    top_score = 0

    def __init__(self, game_name):
        self.game_name = game_name

    @staticmethod
    def show_help():
        print("这里是帮助信息")

    @classmethod
    def show_top_score(cls):
        print("历史最高分是:%d" % cls.top_score)

    def start_game(self):
        print("%s 开始游戏了" % self.game_name)


# 1、查看游戏帮助信息
Game.show_help()
# 2、查看历史最高分
Game.show_top_score()
# 3、创建游戏对象
xiaoming = Game("小明")
xiaoming.start_game()

使用对象模拟房子和家具

class HouseItem:
    """创建家具类"""
    def __init__(self, name, area):
        self.name = name
        self.area = area

    def __str__(self):
        return "家具%s ,占地%d平米" % (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,总面积共%d平米,剩余%d平米,有%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.free_area -= item.area
        # 将家具添加到家具列表中
        self.item_list.append(item.name)

# 创建三种家具
bed = HouseItem("席梦思", 4)
chest = HouseItem("衣柜", 200)
table = HouseItem("餐桌", 1.5)
print(bed)
print(chest)
print(table)

# 创建房子
house = House("海景房", 100)
print(house)
# 添加床
house.add_item(bed)
print(house)
#添加衣柜
house.add_item(chest)
print(house)

使用对象模拟一个士兵开枪发射子弹

class Gun:
    """创建枪类"""
    def __init__(self, model):
        self.model = model
        self.bullet = 40
        self.bullet_count = 0

    def add_bullet(self, count):
        """填装子弹"""
        if count > self.bullet:
            print("弹夹不足,无法填充")
            return
        self.bullet_count += count
        print("子弹填装成功,剩余弹药为%d" % self.bullet_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))

    def __str__(self):
        return "%s" % self.model


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
        self.gun.add_bullet(40)
        self.gun.shoot()

    def __str__(self):
        return "士兵%s,有[%s]枪" % (self.name, self.gun)


ak47 = Gun("AK47")

xusanduo = Soldier("许三多")
# xusanduo.gun = ak47
print(xusanduo)
xusanduo.fire()

你可能感兴趣的:(python,开发语言)