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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Java中摆脱equals,compareTo和toString

我们都曾在POJO中重写过equals(),compareTo()和toString()方法。但是另有其他能做到职责分离的更好的方法并带来更简洁的代码。阅读这篇...

952
来自专栏杨熹的专栏

Day 2-Java-imooc-9-继承

课程地址:http://www.imooc.com/learn/124 总结图片来自 http://www.imooc.com/article/10715 ?...

2788
来自专栏python成长之路

self,和类实例化加不加括号的理解

2205
来自专栏iOS技术杂谈

iOS @property探究(一): 基础详解你要知道的@property都在这里

你要知道的@property都在这里 本文大纲 Apple Adopting Modern Objective-C翻译 @property基本用法 @prope...

4299
来自专栏老九学堂

干货| 期末临近快捷C语言复习

? 盼望着盼望着,寒假近了 当然期末考试也就近了 C 语言,晦涩难懂 对于很多同学来说又是初次接触… 期末考试怎么办 不要担心!老九又出新篇章啦 总结了排序...

3987
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-17(01)总结,登录注册案例,Set集合,HashSet

1:登录注册案例(理解) 需求:用户登录注册案例。 按照如下的操作,可以让我们更符号面向对象思想 A:有哪些类呢? B:每个类有哪些东西呢? C:类与类之...

4027
来自专栏cmazxiaoma的架构师之路

你应该会的一道多线程笔试题

2543
来自专栏社区的朋友们

理解 JDK 中的 MethodHandle

MethodHandle 更像是在Java语法规则内手写字节码:自己创建方法签名(MethodType),自己决定调用方式,自己注意访问控制 ,最后还要自己决定...

1.5K0
来自专栏Phoenix的Android之旅

深入分析ClassCastException

ClassCastException时常见,只要两个不同类强转换就会有这种问题,不过下面这种错误不知道见过没

541
来自专栏我就是马云飞

设计模式二十四章经之解释器模式

1023

扫码关注云+社区