世界上具体存在的万事万物都被称为对象
拿星座举例,比如水瓶座,水瓶座是一个大类,它包含所有在水瓶座日期范围内出生的人。
某个具体存在的人就是一个对象,比如我这个人是水瓶座的,那么我就是水瓶座这个类的对象。
水瓶座的这个人是具体的,而这个水瓶座的类是抽象的。为什么说水瓶座这个类是抽象的呢,因为水瓶座是由所有水瓶座的人所共同拥有的一些特征或属性组成的,将这些特征和属性抽取出来放进水瓶座这个大类中。而水瓶座有个方法就是说一些奇奇怪怪的话,那么我上面写的这些奇奇怪怪的话就可以说明我是水瓶座这个类的对象。而我的出生日期就是一个属性,这个属性在水瓶座规定的出生日期范围
所以一个类中包含属性和方法。当然,作为水瓶座的对象也具有水瓶座的属性和方法。
Python中所有的类都继承自objetc类,默认创建的类都会继承object。
如果想要继承一个类,一个子类可以继承多个父类,当继承了一个类后,会拥有父类的全部属性和方法,包括私有属性和私有方法,但不能直接调用,可以通过父类的方法间接调用。
可以使用super().__方法名__来调用父类的内置方法
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。
重写针对的是方法,即在子类中写一个与父类同名的方法。再次调用这个方法时,会按照子类中的方法执行,同样也可以使用super().方法名来调用父类中同名的方法。由此,子类可以灵活的展示自己的属性和方法,这个就叫做多态。由此,面向对象的三大特征就是封装、继承、多态。
# 当对象被创建出来时就自动调用init函数,进行初始化 # 可以将需要的属性定义在里面,对象创建成功后直接使用 def __init__(self, new_name): self.name = new_name print("我是%s猫,初始化成功!" % self.name)
# 当使用print方法打印对象时,会有一段默认的内容输出 # 如果重写了这个方法,内容将会被替换 def __str__(self): return "helle Tom"
# 1、创建对象,new方法会被自动调用 # 2、__new__是为对象在内存中分配空间的内置函数 def __new__(cls, *args, **kwargs): print("创建对象,new方法被调用")
# 对象从内存中消失才会自动调用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()