面向对象
是一种编程思想
类:具有相同属性或者相同行为的一类事物
对象:是类的具体实例,真实存在的
世界万物皆为对象
战车(类)——→救护车(对象)
属性:名称
行为:run()
在类中定义属性和行为,之后在对象上调用
救护车.run()即为面向对象
class Tank():#类一般首字母大写,驼峰命名
def __init__(self,name,sp): #魔法方法,在创建对象的时候自动执行
self.name = name
self.sp = sp
def __str__(self):#格式化输出,打印对象时打印的值。一定要有返回值。
return '滴度滴度'
def run(self):#self为对象本身
print('战车跑')
def music(self):
print('播放音乐')
jhc = Tank('救护车',4000) #创建了面包车对象
print(jhc)
print('战车名为{},装甲片数量为{}。'.format(jhc.name,jhc.sp))
jhc.run() #调用对象的跑的方法
jhc.music() #调用对象的播放音乐方法
赏金猎人打怪物:
class Gun():
def __init__(self,name):
self.name = name
self.bullet_num = 0
def add_bullet(self,num):#加子弹
self.bullet_num += num
def fire(self,enemy):#枪射击
self.bullet_num -= 1
print('向%s攻击,弹药剩余%s发'%(enemy.name,self.bullet_num))
enemy.damage()
class Soldier():
def __init__(self,name,age,gun=None):
self.name = name
self.age = age
self.gun = gun
self.hp = 80
def open_fire(self,target):#人操作枪
if self.gun is not None:
self.gun.fire(target)#枪开火
else:
print('没有武器')
def damage(self):#造成伤害
self.hp -= 15
if self.hp <= 0:
print('消灭怪物')
else:
print('还剩%s血量'%self.hp)
dangong = Gun('ak47')#创建一把枪
dangong.add_bullet(10)#加子弹
lbn = Soldier('雷班纳',12,dangong)#创建一个猎人
enemy = Soldier('巨蚁',5)#创建个怪物
lbn.open_fire(enemy)
lbn.open_fire(enemy)
lbn.open_fire(enemy)
lbn.open_fire(enemy)
lbn.open_fire(enemy)
lbn.open_fire(enemy)
私有属性和私有方法:属性和方法不能直接调用。前边加__即为私有。
利用公有方法可以给私有属性的值进行校验
私有属性可以避免子类直接访问和名字冲突的问题。
class Dog():
def __init__(self):
self.name = '狗'
self.__age = 12 # 私有属性
# 利用公有方法给私有属性赋值
def set_age(self, age):
if age > 0:
self.__age = age
# 利用公有方法返回私有属性的值
def get_age(self):
return self.__age
dog = Dog()
print(dog.name)
dog.set_age(14)
print(dog.get_age())
私有方法:
class Market():
def __buy(self):#私有方法
return '购买成功'
#利用公有方法去调用私有方法
def check_money(self,money):
if money < 100:
print('金额不足')
else:
return self.__buy()
t = Market()
print(t.check_money(200))
print(t.__buy)#会报错。私有方法可避免直接被调用
实例属性:对象的属性
类属性:定义在类中的属性,有全局的含义
私有实例属性:不想让外部直接访问
私有类属性:不想让外部直接访问
class Tank():
count = 0 # 类属性
__count = 0 # 私有类属性
def __init__(self, name):
self.name = name # 实例属性
Tank.count += 1
self.__age = 12 # 私有实例属性
Tank.__count += 1
def get_age(self):
return self.__age
def get_count(self):
return Tank.__count
jhc = Tank('救护车') # __init__一定会执行
print(Tank.count)
print(jhc.name)
print(jhc.get_age())
print(jhc.get_count())
静态方法:不引用类属性,或者实例属性,实例方法。是个独立个体。
用@staticmethod修饰的方法叫静态方法。静态方法里不能写self,但是可以写参数。
静态方法支持类或对象直接调用。
import time
class Dog():
desc = '哈哈'
def __init__(self):
self.name = '哈士奇'
@staticmethod
def get_time():
return time.strftime('%Y-%m-%d')
print(Dog.get_time())
类方法:
用@classmethod修饰的方法叫类方法,可访问类属性。
公有类属性支持类和对象直接调用。
类方法
class Dog():
count = 0
#魔法方法 初始化方法 构造方法
def __init__(self):
self.name = '哈士奇'
#实例方法
def show(self):
print('哈哈')
#静态方法 类或者对象
@staticmethod
def get_desc():#不访问类属性、实例属性
print('诶嘿')
#类方法
@classmethod
def get_count(cls):#访问类属性、也可以间接通过创建对象来访问对象属性
print(cls.count)
@classmethod
def create_obj(cls):#间接访问
return cls().name
dog= Dog()
dog.get_count() #类方法 支持对象调用
Dog.get_count() #类方法 支持类调用
print(Dog.create_obj())
属性方法:
class Person():
def __init__(self):
self.__age = 0
def set_age(self,age):
if age >0:
self.__age = age
else:
print('报错')
def get_age(self):
return self.__age
p = Person()
p.set_age(10)
print(p.get_age())
class Person():
def __init__(self):
self.__age = 0
@property
def age(self):#相当于get_age方法
return self.__age
@age.setter
def age(self,age):#相当于set_age方法
if age >0:
self.__age = age
else:
print('报错')
p = Person()
p.age = 10#相当于调用set_age方法
print(p.age)#相当于调用get_age方法