当前位置: 首页 > news >正文

python类的封装,继承和多态

1 python类的封装

简单的讲就是将众多属性和方法在类里面实现,外部通过接口访问。

属性的隐藏,先看一个例子:

class Person1:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say(self):
        print("I name is {} and {} years old.".format(self.name, self.age))


if __name__ == '__main__':
    xiaoming = Person1("xiaoming", 12)
    xiaoming.say()

在这个例子中Person1类有两个属性,我们可以直接通过xiaoming加.符号来访问其属性,例如:

    xiaoming.age = 13
    print(xiaoming.age)

实际上对于人的名字和年龄是不能随便改的,因此我们需要使用一个技术“隐藏”,使得外界只能看,不能改

代码如下:

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = age

    @property
    def name(self):
        return self._name

    @property
    def age(self):
        return self._age

    def say(self):
        print("I name is {} and {} years old.".format(self.name, self.age))

if __name__ == '__main__':
    xiaoming = Person("xiaoming", 12)
    xiaoming.say()

    xiaoming.age = 13
    print(xiaoming.age)

在这个例子中实际的变量是self._name, self._age, 外界看不出来,以为还是self.name, self.age

方法是通过装饰器@property将真正的变量遮挡起来,这种手段即隐藏

2 类的继承

通过在定义的新类后面加上待继承的类实现继承

示例:

from person2 import Person

class Student(Person):
    def __init__(self, name, age):
        super().__init__(name, age)


xiaozhang = Student("xiaozhang", 11)
xiaozhang.say()

这里有两点需注意:

1 Person为父类,Student为子类,子类拥有父类的一切特性(属性和方法)

2 super()函数可以调用一切父类的属性和方法(被隐藏的除外)

验证:print(super()._age)        # 这儿会报错,说找不到对应的变量

3 类的多态

同一个方法,不同的行为

示例代码

from person2 import Person

class Student(Person):
    def __init__(self, name, age):
        super().__init__(name, age)

    def say(self):
        print("My name is {} and {} years old and I am in 6 grade.".format(self.name, self.age))

class Programmer(Person):
    def __init__(self, name, age):
        super().__init__(name, age)

    def say(self):
        print("I am a Programmer.My name is {} and {} years old.".format(self.name, self.age))

xiaozhang = Student("xiaozhang", 11)
xiaozhang.say()

Join = Programmer("Join", 35)
Join.say()

相关文章:

  • Spring MongoDB查询附近的人功能实现
  • 第04篇:Resources资源文件处理,再也不怕找不到文件了。
  • 【微信小程序】页面tab栏与页面内容联动
  • spring 启动了两个tomcat 端口问题分析
  • (四)JPA - JQPL 实现增删改查
  • 焦虑经济衍生冥想生意,年轻人会为“放空”买单吗?
  • linux之framebuffer(1)
  • Linux常用基本命令详解(二)-------磁盘分区和磁盘管理类命令
  • Vue:列表排序和筛选(运用计算属性和监视属性(侦听属性))
  • 难点:树的代码
  • vulnhub blogger: 1
  • php项目宝塔搭建实战ThinkAdmin通用公众号小程序后台开发框架
  • Web前端系列技术之Web APIs基础(从基础开始)⑥
  • FPGA学习笔记(四)通过数码管学习顶层模块和例化的编写
  • kafka 代码使用
  • hexo+github搭建个人博客
  • [译]Python中的类属性与实例属性的区别
  • 【css3】浏览器内核及其兼容性
  • bearychat的java client
  • fetch 从初识到应用
  • node.js
  • PHP的类修饰符与访问修饰符
  • SpringBoot 实战 (三) | 配置文件详解
  • vue--为什么data属性必须是一个函数
  • webpack项目中使用grunt监听文件变动自动打包编译
  • Web设计流程优化:网页效果图设计新思路
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 分类模型——Logistics Regression
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于Android乐音识别(2)
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 聊一聊前端的监控
  • 我的面试准备过程--容器(更新中)
  • 一起参Ember.js讨论、问答社区。
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • MyCAT水平分库
  • 说说我为什么看好Spring Cloud Alibaba
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​flutter 代码混淆
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #define,static,const,三种常量的区别
  • #Lua:Lua调用C++生成的DLL库
  • (09)Hive——CTE 公共表达式
  • (13):Silverlight 2 数据与通信之WebRequest
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (阿里云万网)-域名注册购买实名流程
  • (八十八)VFL语言初步 - 实现布局
  • (动态规划)5. 最长回文子串 java解决
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (论文阅读40-45)图像描述1
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)