专栏首页AzMarkPython学习之面向对象「 中 」

Python学习之面向对象「 中 」

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

本文分享自微信公众号 - Python梦工厂(AzMark950831)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 学习之面向对象「下」

    Python技术与生活认知的分享
  • Python学习之面向对象

    Python技术与生活认知的分享
  • Python基础知识

    Python技术与生活认知的分享
  • 面向对象 "一"

    Wyc
  • 面向对象进阶

    反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应...

    超蛋lhy
  • python面向对象,类

        是面向对象中的俩个重要概念,类是对事物的抽象,比如人类,球类。对象是事物的实例,比如足球,篮球。球类可以对球的特征和行为进行抽象,然后可以实例化一个真实...

    py3study
  • python第四十三课——封装性

    1.面向对象的三大特性:封装性、继承性、多态性 封装: 封装使用的领悟: 1).生活层面:食品、快递、计算机、明星... 2).计算机层面: ①.模块...

    hankleo
  • 10. Python 帮助

    int()   str()    dict()   list()   tuple()   一般是这几种类型的转换

    py3study
  • python3--基础综合测试

    解释:char类型在python中不存在,它是其他编程语言的一种数据类型,比如C/C++,JAVA

    py3study
  • 9-面向对象1

    面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作...

    用户3106371

扫码关注云+社区

领取腾讯云代金券