---继承

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

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

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

来看一个实例:

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. js最简单的动画

    $(document).ready(function(){ //�ֶ�����ҳ��Ԫ�� $("#reset").click(function(){ $("*" ...

  2. Arithmatic项目修改总结

    Arithmatic项目修改总结 github仓库 arithmatic3.0 一. 修改介绍 修改后类图: 1.关于类的合并 ==可以发现相比右边(旧)的类,左边(新)的类少了很多,这是我这次大改的 ...

  3. 20162328蔡文琛 大二week01

    教材学习内容总结 算法+程序机构=程序 渐进复杂度称为算法的阶. 算法分析是计算机科学的基础课题. 增长函数显示了与问题大小相关的时间或空间的利用率. 算法的阶由算法增长函数的主项决定. 算法的阶给出 ...

  4. QQ测试计划

             

  5. 1001 A+B

    代码链接 PDF链接 首先要说的是这道题的难点是如何把数字输出加入逗号,毕竟数据范围并没有超过Long.当然这个难点也不是问题,将数字转为字符串,C中就有这样的函数,然后再用 %3==0 这样来控制输 ...

  6. Journal entry of the eleventh chapter to chapter twelfth

    第十一章:正如很多人一样,觉得软件工程这个课程好像没什么用,感觉提高不了自己的写代码能力,学的都是理论知识,好像对于我们这种技术类的专业离得有点远,是这样的吗? 第十二章:每样东西都没有完美的,即使我 ...

  7. 【图论】POJ-3169 差分约束系统

    一.题目 Description Like everyone else, cows like to stand close to their friends when queuing for feed ...

  8. React---点击按钮实现内容复制功能

    思路: 1.给要复制的内容容器添加一个标签(可以是ID,可以是类名等),通过dom技术获取该容器对象: 2.创建Range对象(某个区域内连续的内容),把该容器对象放进去: 3.将Range对象添加到 ...

  9. C++派生类构造函数调用顺序(详解)

    我们来看下面一段代码: class B1 { public: B1(int i) {cout<<"constructing B1 "<<i<<e ...

  10. cxgrid中,如何根据列名或字段名取得footer值

    注意,不是根据index取得footer值cxgrdtbv1.DataController.Summary.FooterSummaryValues[0]; ------解决方案------------ ...