---继承

  当我们定义完成某个类时,可以再定义一个新类,新类可以继承第一个类。新类被称为子类,而被继承的类称为父类/基类/超类。

  继承就是子类继承父类的属性和方法(注意是类属性和类方法)。

  继承可以使子类使用父类中的方法,也可以在子类中新定义某个方法,或者在子类中覆盖父类的方法。

来看一个实例:

class animal(object):    #定义一个动物类
def running(self):
print('running....')
class dog(animal): #定义一个狗类,且狗类继承动物类
def wangwang(self):
print('wang! wang!') xiaohei=dog()
xiaohei.running()
xiaohei.wangwang()
#结果
running....
wang! wang!

  我们可以看到,在上面的例子中,dog类继承animal类后,就不需要再重新定义running方法,可以直接调用animal中的running方法。这就是继承的优点之一。
  如果我们在dog类中也定义一个running方法会怎样?

class animal(object):
def running(self):
print('running....')
class dog(animal):
def wangwang(self):
print('wang! wang!')
def running(self):
print('dog is running')
#结果
dog is running #父类的方法被子类同名的方法覆盖
wang! wang!

  也就是,子类中的方法会覆盖父类中同名的方法!

子类如何执行父类的构造函数?

  1  super(Son, self).__init()

  2  Father.__init__(self)

class Animal(object):
name = 'ahah'
def __init__(self):
self.a = 'animal' class Cat(Animal):
def __init__(self):
super(Cat,self).__init__()
# Animal.__init(self)
self.b = 'cat' c1 = Cat()
print(c1.a) #animal

---多继承

 所谓多继承就是指一个子类可以继承多个父类。大家可能会问:

  1 怎么样才能实现多继承?

  2 如果每个父类都有一个名称相同的方法,当子类调用该方法时最终调用的是哪一个?

1 首先来看第一个问题,怎么样才能实现多继承?

class animal(object):
def running(self):
print('running....')
class mammal(object):
def grow(self):
print('吃奶')
class dog(animal,mammal): #<-----------在括号中加入父类名称,并以逗号分隔即可
def wangwang(self):
print('wang! wang!')
def running(self):
print('dog is running') xiaohei=dog()
xiaohei.running()
xiaohei.wangwang()
xiaohei.grow()
#结果
dog is running
wang! wang!
吃奶

  注意:Python的类可以继承多个类,Java和C#中则只能继承一个类。

2 再来看第二个问题:如果每个父类都有一个名称相同的方法,当子类调用该方法时最终调用的是哪一个?或者说继承顺序是怎样的?

  在回答这个问题之前,我们需要先了解经典类和新式类。

什么是经典类什么是新式类?

class  class_name:  #经典类的定义方法
pass class class_name(object): #新式类的定义方法
pass

  新式类较之经典类添加了很多功能,所以现在推荐用新式类。

在Python3中不管是新式类还是经典类继承顺序都是深度优先


class a(object):
def f(self):
print('a')
self.f1()
def f1(self):
print('a-f1') class b(object):
def f1(self):
print('b') class c(a):
def f1(self):
print('c') class d(b):
def f(self):
print('d') class e(c,d):
def f1(self):
print('e') e1 = e()
e1.f()
 

但有个特殊情况:

  如果A和B都all类的子类,则找完A以后不会找all,而是去找D。

我们可以总结出Python多继承时的优先顺序:

  1  本身最大,先从自身查找

  2  从左到右优先级依次降低,深度优先

  3  若左父类与右父类的上层存在共同的父类,则将共同的父类及其上层移动到右父类的深度级别中

---方法

python中的方法包括普通方法/静态方法/类方法。但静态方法和类方法并不常用。

所有方法均属于类属性,也就是在内存中只有一份

  普通方法:只能由实例调用,最少有一个self参数

  静态方法:不需实例化就可以调用,没有默认参数

  类方法:不需实例化就可以调用。最少有一个cls参数

class test(object):

    def show1(self):
print('普通方法')
@staticmethod #静态方法
def show2():
print('静态方法')
@classmethod #类方法
def show3(cls):
print('类方法') #不实例化
test.show2()
test.show3()
print('------------分隔-------------')
#实例化
a=test()
a.show1()
a.show2()
a.show3() #结果
静态方法
类方法
------------分隔-------------
普通方法
静态方法
类方法

---属性

之前我们讲过,在类中的某个变量前加上两个下划线,就可以将这个变量“隐藏”起来,使其外部不可见。

class atm00(object):
def __init__(self,money):
self.money=money
def show_money(self):
print('the atm has %s¥ '%self.money) a=atm00(100)
a.show_money()
a.money=120
a.show_money()
#结果
the atm has 100¥
the atm has 120¥
#很明显,我们可以直接在外部给a.money赋值,这样虽然操作简单,但是我们无法验证用户输入的money是否合法

这时,我们可以这样修改:

class atm01(object):

    def __init__(self,money):
self.__money=money
def show_money(self):
print('the atm has %s¥ '%self.__money)
def set_money(self,money): #当修改money时,还可以检测用户输入的值是否合法
if not isinstance(money,int):
print("money's value must be interger")
else:
self.__money=money
a=atm01(100)
a.show_money()
a.set_money(120

通过修改,我们让代码更健壮更安全,但是却没有之前在外部直接赋值时的便捷了。有没有一种方法,即可以在外部直接赋值,有可以检测用户输入值的合法性呢?这里我们就要用到属性了!

class atm01(object):
def __init__(self,money_value):
self.__money=money_value
@property #第一种属性
def money(self):
return self.__money
@money.setter              #第二种属性
def money(self,money_value):
if not isinstance(money_value,int):
print("money's value must be interger")
else:
self.__money=money_value
@money.deleter              #第三种属性
def money(self):
print('no money') a=atm01(100)
print(a.money)
a.money=120
print(a.money)
del a.money
#结果
100
120
no money

上面的代码可能会看不懂,没关系,上面仅仅是用来说明属性的重要性,接下来我们来正式的讲解一下属性。

如何定义属性?

属性共有三种。

首先来看第一种属性:

class test(object):
def step1(self):
pass
@property #定义时,在普通方法的基础上添加 @property 装饰器,该方法就成为属性
def step2(self):
return 'hello world'
a=test()
print(a.step2)
#结果
hello world

  注意两点:

    1  属性中仅能包含一个self参数

    2  调用属性时,不需要加括号

第二种和第三种属性:

# ############### 定义 ###############
class Goods(object): @property
def price(self):
print '@property' @price.setter
def price(self, value):
print '@price.setter' @price.deleter
def price(self):
print '@price.deleter' # ############### 调用 ###############
obj = Goods() obj.price # 执行@property 修饰的 price 方法,并获取方法的返回值 obj.price = 123 # 执行@price.setter 修饰的 price 方法,并将 123 赋值给方法的参数 del obj.price # 执行@price.deleter 修饰的 price 方法

总结一下,这三种属性作用分别为显示,修改,删除。

python基础之面向对象02的更多相关文章

  1. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  2. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  3. 二十. Python基础(20)--面向对象的基础

    二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...

  4. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  5. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  6. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

  7. Python基础7 面向对象编程进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...

  8. python基础之面向对象1

    一.面向对象VS面向过程 1.面向过程 2.面向对象 二.类与对象 1.类和对象 (1)基本概念 类和对象的内存图如下: 2.实例成员 (1)实例变量 (2)实例方法: 3.类成员: (1)类变量 ( ...

  9. Python基础之面向对象编程

    面向对象编程 —— Object Oriented Programming 简写 OOP 01. 面向对象基本概念 我们之前学习的编程方式就是 面向过程 的 面向过程 和 面向对象,是两种不同的 编程 ...

随机推荐

  1. php 数组去重

    php 数组去重 数组中重复项的去除 2010-07-28 15:29 一维数组的重复项: 使用array_unique函数即可,使用实例如下: <?php                    ...

  2. 2018年第九届蓝桥杯【C++省赛B组】

    2标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛.16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. 一个字节可以存储8位信息,用32个字节就 ...

  3. web06-PanduanLogin

    电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aikan66 ...

  4. Task 6.2冲刺会议七 /2015-5-20

    今天把主界面改善了一下,主要功能时摄像头的使用以及语音聊天的部分,两个部分的设计原理基本相同,但是可是好几个模块让有点不知道该怎么下手.这时候我感觉到了模块拼接是很困难的,只有十分清楚每个模块才能很好 ...

  5. 《Spring1之第八次站立会议》

    <第八次站立会议> 昨天:我查找了关于实现视频功能的相关代码. 今天:对用C#写的视频功能进行了相关的了解. 遇到的问题:由于对C#不是很了解,所以其中的有些代码还是看不懂.

  6. bata6

    目录 组员情况 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团队签入记 ...

  7. 项目Beta冲刺(团队)总结

    团队成员及分工 姓名 学号 分工 陈家权 031502107 前端(消息模块) 赖晓连 031502118 前端(问答模块) 雷晶 031502119 服务器 林巧娜 031502125 前端(首页模 ...

  8. DPDK skeleton basicfwd 源码阅读

    学习这个例子用于理解单纯的 dpdk 转发过程,L2 和 L3 的转发是基于此:在rte_eth_rx_burst()收包后进行解包,提取 mac.ip 等信息然后在转发到输出网卡. 如果要写出自己的 ...

  9. java属性编辑器,即PropertyEditor

    出处:http://www.iteye.com/topic/1123628

  10. 浅谈Java中的Hashmap

    HashMap:   java.lang.Object ∟ java.util.AbstractMap<K,V> ∟ java.util.HashMap<K,V> 类型参数: ...