Python学习之面向对象“中”

阅读文本大概需要 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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180615G0CBB900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券