面向对象的三大特性

  • 封装
  • 继承
  • 多态

封装

  • 封装就是对对象的成员进行访问限制

  • 封装的三个级别:

    • 公开,public
    • 受保护的,protected
    • 私有的,private
    • public,private,protected不是关键字
  • 判断对象的位置

    • 对象内部
    • 对象外部
    • 子类中
  • 私有

    • 私有成员是最高级别的封装,只能在当前类或对象中访问

    • 在成员前面添加两个下划线即可

        class Person():
      # name是公有的成员
      name = "小明"
      # __age是私有的成员
      __age = 18
    • Python的私有不是真私有,是一种称为name mangling的改名策略 可以使用对象,_classname__attributename(_类名__属性名)访问

  • 受保护的封装 protected

    • 受保护的封装是将对象成员进行一定级别的封装,然后,在类中或者子类中都可以进行访问,但是在外部不可以
    • 封装方法:在成员名称前添加一个下划线即可
  • 公开的,公共的 public

    • 公共的封装实际对成员没有人有操作,任何地方都可以访问

继承

  • 继承就是一个类可以获得另外一个类中的成员属性和成员方法
  • 作用:减少代码,增加代码的复用功能,同时可以设置类与类直接的关系
  • 继承与被继承的概念:
    • 被继承的类叫父类,也叫基类,也叫超类
    • 用于继承的类,叫子类,也叫派生类
    • 继承与被继承一定存在一个 is-a 关系

# 继承的语法
# 在python中,任何类都有一个共同的父类叫object
>>> class Person():
name = 'NoName'
age = 0
def sleep(self):
print("Sleeping ... ...") #父类写在括号内
>>> class Teacher(Person):
def teach(self):
pass >>> t = Teacher()
>>> print(t.name)
>>> print(Teacher.name) 输出:
NoName
NoName
  • 继承的特征

    • 所有的类都继承自object类,即所有的类都是object类的子类
    • 子类一旦继承父类,则子类可以使用父类中除私有成员外的所有内容
    • 子类继承父类后并没有将父类成员完全复制到子类中,而是通过引用关系访问调用
    • 子类中可以定义独有的成员属性和方法
    • 子类中定义的成员和父类成员如果相同,则优先使用子类成员
    • 子类如果想扩充父类的方法,可以在定义新方法的同时访问父类成员来进行代码重用,可以使用 父类名.父类成员 的格式来调用父类成员,也可以使用 super().父类成员的格式来调用
  • 继承变量函数的查找顺序问题

    • 优先查找自己的变量
    • 没有则查找父类
    • 构造函数如果本类中没有定义,则自动查找调用父类构造函数
    • 如果本类有定义,则不再继续向上查找
  • 构造函数

    • 是一类特殊的函数,在类进行实例化之前进行调用
    • 如果定义了构造函数,则实例化时使用构造函数,不查找父类构造函数
    • 如果没定义,则自动查找父类构造函数
    • 如果子类没定义,父类的构造函数带参数,则构造对象时的参数应该按父类参数构造
  • super

    • super不是一个关键字,而是一个类
    • super的作用是获取MRO(MethodResolustionOrder)列表中的第一个类
    • super于父类直接没有任何实质性关系,但通过super可以调用到父类
    • super使用两个方法,参见在构造函数中调用父类的构造函数

>>> class Person(object):
name = 'NoName'
age = 18
__score = 0 # 考试成绩是秘密,只要自己知道
_petname = "sec" #小名,是保护的,子类可以用,但不能公用
def sleep(self):
print("Sleeping ... ...") >>> class Teacher(Person):
pass # 创建一个Teacher类实例
>>> t = Teacher()
# 子类实例访问父类public类型的变量 可以
>>> print(t.name)
# 子类实例访问父类的protected类型的变量 可以
>>> print(t._petname)
# 子类访问父类的private类型的变量 不可以
# print(t.__score) >>> p = Person()
>>> print(p._Person__score) >>> print('*' * 20)
>>> print(id(Person.name))
>>> print(id(t.name)) >>> t.sleep() 输出:
NoName
sec
0
********************
4496482928
4496482928
Sleeping ... ...

# 子类和父类定义同一个名称变量,则优先使用子类本身
>>> class Person(object):
name = 'NoName'
age = 18
__score = 0 # 考试成绩是秘密,只要自己知道
_petname = "sec" #小名,是保护的,子类可以用,但不能公用
def sleep(self):
print("Sleeping ... ...") >>> class Teacher(Person):
name = '我是老师的名字' >>> t = Teacher()
>>> print(t.name) 输出:
我是老师的名字

# 子类扩充父类功能
# 人有工作的函数 老是也有工作的函数 ,但老师的工作是讲课
>>> class Person(object):
name = 'NoName'
age = 18
__score = 0 # 考试成绩是秘密,只要自己知道
_petname = "sec" #小名,是保护的,子类可以用,但不能公用
def sleep(self):
print("Sleeping ... ...")
def work(self):
print("make some money...") >>> class Teacher(Person):
name = '我是老师的名字'
def make_test(self):
print("attention")
def work(self):
# 扩充父类的功能只需要调用父类相应的函数
#Person.work(self)
# 扩充父类的另一种方法
# super代表得到父类
super().work()
self.make_test() >>> t = Teacher()
>>> t.work() 输出:
make some money...
attention

# 构造函数的概念 >>> class Dog():
# __init__就是构造函数
# 每次实例化的时候,第一个被自动的调用
# 主要工作是进行初始化
def __init__(self):
print("I am init in dog") >>> kaka = Dog() # 实例化的时候自动调用了构造函数,括号内参数需要跟构造函数的参数匹配 输出:
I am init in dog

# 继承中的构造函数 -1
>>> class Animal(): # 动物
pass >>> class mammal(Animal): #哺乳动物
pass >>> class Dog(mammal): # 狗是哺乳动物
# __init__就是构造函数
# 每次实例化的时候,第一个被自动的调用
# 主要工作是进行初始化
def __init__(self):
print("I am init in dog") # 实例化的时候 自动调用了Dog的构造函数
>>> kaka = Dog() 输出:
I am init in dog

# 继承中的构造函数 -2
>>> class Animal(): # 动物
pass >>> class mammal(Animal): #哺乳动物
def __init__(self):
print("我是哺乳动物的父类") >>> class Dog(mammal): # 狗是哺乳动物
# __init__就是构造函数
# 每次实例化的时候,第一个被自动的调用
# 主要工作是进行初始化
def __init__(self):
print("I am init in dog") # 实例化的时候 自动调用了Dog的构造函数
>>> kaka = Dog() # 猫没有用写构造函数
>>> class Cat(mammal):
pass # 此时应该自动调用构造函数,因为Cat没有构造函数,所以查找父类的构造函数
# 在父类mammal中查找到了构造函数,则停止向上查找
>>> c = Cat() 输出:
I am init in dog
我是哺乳动物的父类

# 继承中的构造函数 -3
>>> class Animal(): # 动物
pass >>> class mammal(Animal): #哺乳动物
def __init__(self, name):
print("我是哺乳动物的父类{0}".format(name)) >>> class Dog(mammal): # 狗是哺乳动物
# __init__就是构造函数
# 每次实例化的时候,第一个被自动的调用
# 主要工作是进行初始化
def __init__(self):
print("I am init in dog") # 实例化Dog时,查找到Dog的构造函数,参数匹配,不报错
>>> kaka = Dog() >>> class Cat(mammal):
pass # 实例化Cat类时,调用Cat类的构造函数,由于Cat没有构造函数,则向上查找,查找到父类mammal的构造,停止查找
# 因为mammal的构造函数需要两个参数,实例化的时候给了一个,报错
>>> #c = Cat() 输出:
I am init in dog

# 继承中的构造函数 -4
>>> class Animal(): # 动物
def __init__(self):
print("我是动物") >>> class mammal(Animal): #哺乳动物
pass >>> class Dog(mammal): # 狗是哺乳动物
pass # 实例化Dog类时候,没有构造函数 一直向上查找,直到Animal类
>>> kaka = Dog() 输出:
我是动物

Python学习记录7-继承的更多相关文章

  1. Python学习记录day7

    目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...

  2. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  3. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  4. Python学习记录day8

    目录 Python学习记录day8 1. 静态方法 2. 类方法 3. 属性方法 4. 类的特殊成员方法 4.1 __doc__表示类的描述信息 4.2 __module__ 和 __class__ ...

  5. Python学习记录:括号配对检测问题

    Python学习记录:括号配对检测问题 一.问题描述 在练习Python程序题的时候,我遇到了括号配对检测问题. 问题描述:提示用户输入一行字符串,其中可能包括小括号 (),请检查小括号是否配对正确, ...

  6. 实验楼Python学习记录_挑战字符串操作

    自我学习记录 Python3 挑战实验 -- 字符串操作 目标 在/home/shiyanlou/Code创建一个 名为 FindDigits.py 的Python 脚本,请读取一串字符串并且把其中所 ...

  7. 我的Python学习记录

    Python日期时间处理:time模块.datetime模块 Python提供了两个标准日期时间处理模块:--time.datetime模块. 那么,这两个模块的功能有什么相同和共同之处呢? 一般来说 ...

  8. Python 学习记录

    记录一些 学习python 的过程 -------------------------------------- 1. 初始学习 @2013年10月6日 今天开始学习python 了 遇到好多困难但是 ...

  9. python学习记录_IPython基础,Tab自动完成,内省,%run命令_

        这是我第一次写博客,之前也有很多想法,想把自己所接触的,以文本的形式储存,总是没有及时行动.此次下定决心,想把自己所学,所遇到的问题做个记录共享给诸位,与此同时自己作为备忘,感谢各位访问我的博 ...

  10. Python学习记录----数据定义

    摘要: 描述Python中数据定义格式,需要注意的东东. 一 数据声明 Python木有一般语言的具体数据类型,像char,int,string这些通通木有.这有点像javascript,但又不同,j ...

随机推荐

  1. eclipse、MyEclipse 修改字符集和JDK

    eclipse 中UTF-8设置 1.windows->Preferences   打开"首选项"对话框: 2.然后,general->Workspace,右 侧Tex ...

  2. MATLAB常用快捷键总结

    MATLAB 命令栏显示处理的常用命令 清屏:clc 紧凑显示格式:format compact 宽松显示格式:format loose 数据高精度显示:format longG 数据低精度显示:fo ...

  3. PAT 甲级 1016 Phone Bills (25 分) (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)

    1016 Phone Bills (25 分)   A long-distance telephone company charges its customers by the following r ...

  4. SecureCRT 添加Mac Localhost

    1.启动sshd服务: sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist 停止sshd服务的方法: sudo launchc ...

  5. Flutter 贝塞尔曲线切割

    现在人们对于网站的美感要求是越来越高了,所以很多布局需要优美的曲线设计.当然最简单的办法是作一个PNG的透明图片,然后外边放一个Container.但其内容如果本身就不是图片,只是容器,这种放入图片的 ...

  6. ps命令入门使用指南

    声明:本文算不上原创,主要是参考和整理了该博客ps命令详解 Shell 命令: ps [options] [--help] ps 常用参数: l 长格式输出: u 按用户名和启动时间的顺序来显示进程: ...

  7. Go语言中defer语句使用小结

    defer是Go语言中的延迟执行语句,用来添加函数结束时执行的代码,常用于释放某些已分配的资源.关闭数据库连接.断开socket连接.解锁一个加锁的资源.Go语言机制担保一定会执行defer语句中的代 ...

  8. poj2318(叉积判断点在直线左右+二分)

    题目链接:https://vjudge.net/problem/POJ-2318 题意:有n条线将矩形分成n+1块,m个点落在矩形内,求每一块点的个数. 思路: 最近开始肝计算几何,之前的几何题基本处 ...

  9. hanlp分词工具应用案例:商品图自动推荐功能的应用

    本篇分享一个hanlp分词工具应用的案例,简单来说就是做一图库,让商家轻松方便的配置商品的图片,最好是可以一键完成配置的. 先看一下效果图吧: 商品单个推荐效果:匹配度高的放在最前面 这个想法很好,那 ...

  10. 更新neo4j节点信息

    将多个属性的内容更新到节点上 def update_by_id(id,graph,**kwargs): """ 更新节点的属性 根据节点的ID来更新节点的属性,如果存在该 ...