前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python学习之面向对象「 中 」

Python学习之面向对象「 中 」

作者头像
Python技术与生活认知的分享
发布2018-07-03 12:20:10
3200
发布2018-07-03 12:20:10
举报
文章被收录于专栏:AzMark

阅读文本大概需要 6 分钟

数据封装1

私有属性:在 Python 中如果让内部属性不被外部直接访问,可以在属性前加两个下划线 __

注意:如果只有一个 _ 意思也是私有属性,虽然外部可以访问,但是不要直接访问

代码语言:javascript
复制
   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__()方法)不会被自动调用,它需要在其子类的构造方法中亲自调用

代码语言:javascript
复制
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 的子类才可以传入

代码语言:javascript
复制
class Robot(object):

    pass


def run(Animal):

    print("Just run")


a = Animal()

run(a)


d = Dog()

run(d)


r = Robot()

run(r)

判断对象类型4

代码语言:javascript
复制
print(type(a))

print(dir(a))  # 获取对象 a 的所有属性和方法 

b1 = isinstance(a, Animal)

b2 = isinstance(d, Animal)

print(b1, b2)

对象属性与实例属性5

代码语言:javascript
复制
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

代码语言:javascript
复制
class BulletBox(object):

    def __init__(self, count):

        self.count = count

枪类7

代码语言:javascript
复制
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

代码语言:javascript
复制
class Person(object):


    def __init__(self, gun):

        self.gun = gun


    def fire(self):

        self.gun.shoot()

射击类9

代码语言:javascript
复制
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 
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python梦工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档