---继承

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

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

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

来看一个实例:

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. 哪些场景下无法获得上一页referrer信息

    哪些场景下无法获得上一页referrer信息 直接在浏览器地址栏中输入地址: 使用 location.reload() 刷新(location.href 或者  location.replace()  ...

  2. java第一次实验报告

    北京电子科技学院(BESTI) 实    验    报    告 课程名称:java实验      班级:1352         姓名:潘恒      学号:20135209 成绩:         ...

  3. js实现把一个页面层数据传递到另一个页面

    由于之前面试,被问到过此问题,所以今天特意整理了一下.由于自己技术水平有限,若存在错误,欢迎提出批评. 本博客整理了两种方式从一个页面层向另一个页面层传递参数. 一. 通过cookie方式 1. 传递 ...

  4. 《TCP/IP 详解 卷1:协议》第 2 章:Internet 地址结构

    第二章介绍 Internet 使用的网络层地址,即熟知的 IP 地址.连接到 Internet 的设备,基于 TCP/IP 的专用网络中使用的设备都需要一个 IP 地址. 路由器(见 IP 协议 一章 ...

  5. ACM的fflush(stdin)的问题

    在最近的刷题过程中,因为用到了很多字符串的操作,有时需要多次清空缓冲区,所以用了fflush(stdin);的语句,确实很好用,但是发现在OJ上提交后会出现runtime error的问题.当时并没有 ...

  6. express框架结合ejs模板引擎使用

    我们在项目里建立一个views文件夹(必须),如果你不想使用views文件夹的话需要调用app.set("views","自定义文件夹名"),然后在里面建立一个 ...

  7. angularJS1笔记-(16)-模块里的constant、value、run

    index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  8. js作用域相关笔记

    1.js引擎.编译器.作用域. 引擎:负责JS全过程的编译和执行: 编译器:负责语法分析和代码生成: 作用域:负责收集并维护声明组成的查询,以及当前执行代码对这些变量的访问权限(简言之,作用域就是用于 ...

  9. json 数组

    /** * 获取 选中的id * @returns {*} */function getCheckedList(){ var groups =[]; $("input[name='check ...

  10. request使用代理

    # *_*coding:utf-8 *_* import requests url = 'http://test.yeves.cn/test_header.php' params = {'id':'1 ...