阅读文本大概需要 6 分钟
数据封装1
私有属性:在 Python 中如果让内部属性不被外部直接访问,可以在属性前加两个下划线 __
注意:如果只有一个 _ 意思也是私有属性,虽然外部可以访问,但是不要直接访问
def __init__(self, name, age):
# 定义属性
self.name = name
self.__age = age # 私有属性
# 通过内部自定义的方法,修改私有属性
def setAge(self, age):
# 过滤数据
if age < 0 or age > 150:
self.__age = 0
print("您来自火星吧")
else:
self.__age = age
def getAge(self):
return self.__age
p5 = Person("Iu", -12)
# print(p5.__age) # 访问不到
print(p5.getAge()) # -12
p5.setAge(-12)
print(p5.getAge()) # 0
继承2
继承是指子类可以使用父类的属性和方法,其优点是:实现了代码的重用性
需要注意的是:在继承中父类的构造(__init__()方法)不会被自动调用,它需要在其子类的构造方法中亲自调用
class Animal(object):
age = 23
def eat(self):
print("Eat food")
class Dog(Animal):
def eat(self):
print("Eat meat")
class Cat(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 的子类才可以传入
class Robot(object):
pass
def run(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
class Person(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) # 类属性不会被改变
# 删除对象中的实例属性,调用时会使用类属性
del p.name
print(p.name) # Mark
接下来分享一下那个用枪射击的例子源码,需求:人开枪射击一次,子弹少一发
弹夹类6
class BulletBox(object):
def __init__(self, count):
self.count = count
枪类7
class Gun(object):
def __init__(self, bulletBox):
self.bulletBox = bulletBox
def shoot(self):
if self.bulletBox.count == 0:
print("没有子弹了")
else:
self.bulletBox.count -= 1
print("还有 %d 发子弹" % self.bulletBox.count)
人类8
class Person(object):
def __init__(self, gun):
self.gun = gun
def fire(self):
self.gun.shoot()
射击类9
from shootTest.bulletBox import BulletBox
from shootTest.person import Person
from shootTest.gun import Gun
# 弹夹 6发子弹
count = 6
bulletBox = BulletBox(count)
# 枪
gun = Gun(bulletBox)
# 人
per = Person(gun)
i = 0
while i <= count:
per.fire()
i += 1