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 条评论
登录 后参与评论

相关文章

来自专栏ml

c语言格式大整理

1、C语言中,非零值为真,真用1表示;零值为假,假用0表示。 2、转义字符参考: \a 蜂鸣,响铃  \b 回退:向后退一格 ...

2947
来自专栏程序员八阿哥

王老板Python面试(4):Python面试攻略(嗨谈篇)

答:*args表示可变参数(variadic arguments),它允许你传入0个或任意个无名参数,这些参数在函数调用时自动组装为一个tuple; **kwa...

812
来自专栏Java开发者杂谈

java如何获取一个对象的大小

When---什么时候需要知道对象的内存大小 在内存足够用的情况下我们是不需要考虑java中一个对象所占内存大小的。但当一个系统的内存有限,或者某块程序代码允许...

5266
来自专栏学海无涯

14.闭包

791
来自专栏Micro_awake web

JavaScript(四):运算符&数据类型转换

+:算符的加法;连接字符串 加法会将其它类型的值,自动转为字符串,然后再进行连接运算! 1 var a=1+2; 2 console.log('first:...

1856
来自专栏Dawnzhang的开发者手册

ArrayMap和HashMap区别

Hash,也可以称为“散列”,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这是一种压缩映射,也就是,散列值的空间通常远小于输入的...

533
来自专栏尾尾部落

[剑指offer] 链表中倒数第k个结点 [剑指offer] 链表中倒数第k个结点

经典的双指针法。定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历,由于两个...

752
来自专栏有趣的Python

慕课网-c语言入门-学习笔记

个人整理,学习自用。课程内容by慕课网。 c语言入门 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效...

4226
来自专栏大数据学习笔记

Java程序设计(Java9版):第2章 数据类型与运算符(Data types and Operators)

第2章 数据类型与运算符(Data types and Operators) I think everybody in this country should ...

1895
来自专栏熊二哥

正则表达式快速入门

6月进入前端技术的学习,正则算是跳不过的一个坎了,这部分没有太多需要理解的内容,知道就是王道。 ? ? 正则表达式(Regular Expression):在...

1745

扫码关注云+社区