python基础之面向对象02
---继承
当我们定义完成某个类时,可以再定义一个新类,新类可以继承第一个类。新类被称为子类,而被继承的类称为父类/基类/超类。
继承就是子类继承父类的属性和方法(注意是类属性和类方法)。
继承可以使子类使用父类中的方法,也可以在子类中新定义某个方法,或者在子类中覆盖父类的方法。
来看一个实例:
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的更多相关文章
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- 二十. Python基础(20)--面向对象的基础
二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
- Python基础7 面向对象编程进阶
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...
- python基础之面向对象1
一.面向对象VS面向过程 1.面向过程 2.面向对象 二.类与对象 1.类和对象 (1)基本概念 类和对象的内存图如下: 2.实例成员 (1)实例变量 (2)实例方法: 3.类成员: (1)类变量 ( ...
- Python基础之面向对象编程
面向对象编程 —— Object Oriented Programming 简写 OOP 01. 面向对象基本概念 我们之前学习的编程方式就是 面向过程 的 面向过程 和 面向对象,是两种不同的 编程 ...
随机推荐
- js格式化json字符串和json对象
1,格式化json对象 var json = {"@odata.context":"$metadata#AddTableOne_466281s","v ...
- 渡过OO的死劫,了解规格的意义——OO第三次博客总结
当熬过了一次次黑暗,迎接我们的却是被扣的惨不忍睹的JSF ┭┮﹏┭┮ 一.总结调研 规格的历史 传统科学的特点是发现世界,而软件的特点是构造世界.软件的最底层就是0,1,两个离散的值.程序设计语言的三 ...
- 使用sqlyog创建数据库的错误
1.错误代码: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL s ...
- 炸弹人NABCD分析
团队项目NABCD分析结果 N(Need 需求):现在安卓手游比较热门,所以我们想要编写这样一款软件应用于学生,让学生可以在课余时间放松心情,缓解学习压力. A (Approach 做法):使用Coc ...
- 再学HTML之一
Html 超文本标记语言 什么是html? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言, ...
- linux上传的命令
pscp D:\apache-tomcat-8.0.38\webapps\GameDataServer.zip root@112.74.32.215:/usr/local/tools/tomcat/a ...
- Head First Java & 异常
- RabbitMQ使用笔记
一.安装 1.下载所需安装包 下载服务端(原因在于RabbitMQ服务端代码是使用并发式语言erlang编写的):http://www.rabbitmq.com/install-windows.htm ...
- vue router 几种方式对比 (转载)
<div id="app"> <h1>Hello App!</h1> <p> <!-- 使用 router-link 组件来导 ...
- poj 1144(割点)
题目链接:http://poj.org/problem?id=1144 题意:给出一个无向图,求关键节点的个数. 分析:双连通分量Tarjan算法直接求割点就行了,裸的模板题. AC代码: #incl ...