阅读文本大概需要 6 分钟
数据封装
1
私有属性:在 Python 中如果让内部属性不被外部直接访问,可以在属性前加两个下划线__
注意:如果只有一个_意思也是私有属性,虽然外部可以访问,但是不要直接访问
def__init__(self, name, age):
# 定义属性
self.name = name
self.__age = age# 私有属性
# 通过内部自定义的方法,修改私有属性
defsetAge(self, age):
# 过滤数据
ifage 150:
self.__age =
print("您来自火星吧")
else:
self.__age = age
defgetAge(self):
returnself.__age
p5 = Person("Iu",-12)
# print(p5.__age) # 访问不到
print(p5.getAge())# -12
p5.setAge(-12)
print(p5.getAge())# 0
继承
2
继承是指子类可以使用父类的属性和方法,其优点是:实现了代码的重用性
需要注意的是:在继承中父类的构造(__init__()方法)不会被自动调用,它需要在其子类的构造方法中亲自调用
classAnimal(object):
age =23
defeat(self):
print("Eat food")
classDog(Animal):
defeat(self):
print("Eat meat")
classCat(Animal):
pass
dog = Dog()
dog.eat()# Eat meat
print(dog.age)# 23
cat = Cat()
cat.eat()# Eat food
多态
3
多态:Python 中的多态和自己之前学过的 Java 中的多态不同。Python是一种动态语言,崇尚鸭子类型:「 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子 」
如同下面的代码:机器人并非动物类型,但机器人也可以走,所以能传入 run() 方法中。在静态语言 Java 中,必须满足是 Animal 的子类才可以传入
classRobot(object):
pass
defrun(Animal):
print("Just run")
a = Animal()
run(a)
d = Dog()
run(d)
r = Robot()
run(r)
判断对象类型
4
print(type(a))
print(dir(a))# 获取对象 a 的所有属性和方法
b1 = isinstance(a, Animal)
b2 = isinstance(d, Animal)
print(b1, b2)
对象属性与实例属性
5
classPerson(object):
name ="Mark"# 类属性
def__init__(self, name):
self.name = name# 对象(实例)属性
print(Person.name)
p = Person("Iu")
p.name ="Tom"
p.age =23# 动态的给对象添加类属性,但该属性只针对当前对象有效
print(p.name, p.age)# 对象属性的优先级高于类属性
p2 = Person("Jack")
print(p2.age)# p2 没有 age 属性
print(Person.name)# 类属性不会被改变
# 删除对象中的实例属性,调用时会使用类属性
delp.name
print(p.name)# Mark
接下来分享一下那个用枪射击的例子源码,需求:人开枪射击一次,子弹少一发
弹夹类
6
classBulletBox(object):
def__init__(self, count):
self.count = count
枪类
7
classGun(object):
def__init__(self, bulletBox):
self.bulletBox = bulletBox
defshoot(self):
ifself.bulletBox.count ==:
print("没有子弹了")
else:
self.bulletBox.count -=1
print("还有 %d 发子弹"% self.bulletBox.count)
人类
8
射击类
9
fromshootTest.bulletBoximportBulletBox
fromshootTest.personimportPerson
fromshootTest.gunimportGun
# 弹夹 6发子弹
count =6
bulletBox = BulletBox(count)
# 枪
gun = Gun(bulletBox)
# 人
per = Person(gun)
i =
whilei
per.fire()
i +=1
领取专属 10元无门槛券
私享最新 技术干货