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

相关文章

来自专栏我和未来有约会

简练的视图模型 ViewModel

patterns & practices Developer Center 发布了 Unity Application Block 1.2 for Silver...

2349
来自专栏Pulsar-V

Save Camera Document

#pragma once #include "HCCamera.h" #include <time.h> #include <cstdio> #incl...

2908
来自专栏前端儿

Web 前端颜色值--字体--使用,整理整理

颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) 表示法进行定义。对光源进行设置的最低值可以是 0(十六进制 00)。最高值是 2...

2762
来自专栏码匠的流水账

聊聊spring cloud的HystrixAutoConfiguration

本文主要研究一下spring cloud的HystrixAutoConfiguration

1132
来自专栏搞前端的李蚊子

Html5模拟通讯录人员排序(sen.js)

// JavaScript Document  var PY_Json_Str = ""; var PY_Str_1 = ""; var PY_Str_...

6396
来自专栏码匠的流水账

聊聊HystrixThreadPool

hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java

931
来自专栏Ryan Miao

ehcache报错

jfinal2.0+tomcat7+ehcache2.6.11+Linux Linux version 2.6.18-164.el5 (mockbuild@x8...

3749
来自专栏码匠的流水账

java9系列(五)Stack-Walking API

java9新增这个类的目的是提供一个标准API用于访问当前线程栈,之前只有Throwable::getStackTrace、Thread::getStackTr...

471
来自专栏Golang语言社区

Knapsack problem algorithms for my real-life carry-on knapsack

I'm a nomad and live out of one carry-on bag. This means that the total weight o...

1192
来自专栏一个会写诗的程序员的博客

java.base.jmod

/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ jmod list java....

1182

扫码关注云+社区