深入浅析Python的类


Posted in Python onJune 22, 2018

面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下。

创建和使用类

class Dog():
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def sit(self):
    print(self.name.title() + " is now sitting.")
  def roll_over(self):
    print(self.name.title() + " rolled over!")
 
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
 
运行结果:
My dog's name is Willie.
My dog is 6 years old.

class关键字:来定义一个类。类名通常首字母为大写。

__init__方法:特殊方法,每当实例类的时候都会运行。其中的形参self必不可少,而且必须位于最前面。

self形参:类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候

用不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身。

实例的方法是指定类名以及需要传入的实参。

要访问实例的属性或者调用方法,可使用句点表示法。

使用类和实例

class Car():
  def __init__(self, make, model, year):
    self.make = make
    self.model = model
    self.year = year
    self.odometer_reading = 0 #<- here
 
  def get_descriptive_name(self):
    long_name = str(self.year) + ' ' + self.make + ' ' + self.model
    return long_name.title()
 
  def read_odometer(self):
    print("This car has " + str(self.odometer_reading) + " miles on it.")
 
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
 
运行结果:
2016 Audi A4

可以看到,我们给Car类的属性指定了默认值self.odometer_reading = 0。如果要修改它,我们可以通过实例直接访问它并修改,比如:my_new_car.odometer_reading = 23。或者通过方法修改属性的值。或者通过方法对属性的值进行递增。

class Car():
  --snip--
  #通过方法修改属性的值
  def update_odometer(self, mileage):
    self.odometer_reading = mileage
 
  #通过方法对属性的值进行递增
  def increment_odometer(self, miles):
    self.odometer_reading += miles

继承

一个类继承另一个类时,他将自动获得另一个类的所有属性和方法;原有的类称为父类,新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

现在我们有一个Car类如下

class Car():
  def __init__(self, make, model, year):
    self.make = make
    self.model = model
    self.year = year
    self.odometer_reading = 0 #<- here
 
  def get_descriptive_name(self):
    long_name = str(self.year) + ' ' + self.make + ' ' + self.model
    return long_name.title()
 
  def read_odometer(self):
    print("This car has " + str(self.odometer_reading) + " miles on it.")
 
  def update_odometer(self, mileage):
    self.odometer_reading = mileage
 
  def increment_odometer(self, miles):
    self.odometer_reading += miles

创建子类实例时,python首先给父类所有属性赋值。

接下来我们创建新类EleCar

class Car():
  --snip--
 
class ElectricCar(Car):
  def __init__(self, make, model, year):
    super().__init__(make, model, year)
 
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
 
运行结果:
2016 Tesla Model S

首先父类必须位于子类前面。

super()是一个特殊函数,将父类和子类关联起来。使得可调用子类的父类的方法__init__(),让子类包父类的所有属性。

给子类定义属性和方法没有任何限制,比如:

class Car():
  --snip--
 
class ElectricCar(Car):
  def __init__(self, make, model, year):
    super().__init__(make, model, year)
    self.battery_size = 70
 
  def describe_battery(self):
    print("This car has a " + str(self.battery_size) + "-kWh battery.")
 
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
 
运行结果:
2016 Tesla Model S
This car has a 70-kWh battery.

如果需要重写父类的方法,只需定义一个与重写的父类方法同名的方法即可。

python还可以使用其他类的实例作为自己类的属性。

导入类

类似函数,类也可以保存为.py文件形成模块从而进行导入。

导入单个类:

from model_name import class_name

导入一个模块的多个类:

from model_name import class_name1, class_name2

导入一个模块所有类:

from model_name import *

导入整个模块:

import model_name

还可以在一个模块中导入另一个模块

python标准库

其是一组模块。模块collections中有一个类OrderedDict。字典的键值对没有顺序,但是这个类几乎和字典相同,区别只在于记录了键值对的顺序。

from collections import OrderedDict
 
favorite_languages = OrderedDict()
 
favorite_languages['jen'] = 'python'
favorite_languages['sarah'] = 'c'
favorite_languages['edward'] = 'ruby'
favorite_languages['phil'] = 'python'
 
for name, language in favorite_languages.items():
  print(name.title() + "'s favorite language is " +
language.title() + ".")
 
运行结果:
Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Ruby.
Phil's favorite language is Python.
Python 相关文章推荐
Python内置的字符串处理函数详细整理(覆盖日常所用)
Aug 19 Python
python中正则表达式的使用详解
Oct 17 Python
Flask框架中密码的加盐哈希加密和验证功能的用法详解
Jun 07 Python
matplotlib给子图添加图例的方法
Aug 03 Python
python用fsolve、leastsq对非线性方程组求解
Dec 15 Python
Python代码打开本地.mp4格式文件的方法
Jan 03 Python
python深copy和浅copy区别对比解析
Dec 26 Python
python中sympy库求常微分方程的用法
Apr 28 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
python集合能干吗
Jul 19 Python
浅析NumPy 切片和索引
Sep 02 Python
python用tkinter实现一个gui的翻译工具
Oct 26 Python
基于python绘制科赫雪花
Jun 22 #Python
python3读取csv和xlsx文件的实例
Jun 22 #Python
django admin 后台实现三级联动的示例代码
Jun 22 #Python
python使用turtle库与random库绘制雪花
Jun 22 #Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 #Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 #Python
详解python中的json和字典dict
Jun 22 #Python
You might like
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
jQuery 对象中的类数组操作
2009/04/27 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
ES6扩展运算符用法实例分析
2017/10/31 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
如何将HTML字符转换为DOM节点并动态添加到文档中详解
2018/08/19 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
JavaScript在web自动化测试中的作用示例详解
2019/08/25 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
在Django的视图中使用form对象的方法
2015/07/18 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
python中的yield from语法快速学习
2020/11/06 Python
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
Melijoe时尚童装德国官网:Melijoe德国
2016/09/03 全球购物
CK加拿大官网:Calvin Klein加拿大
2020/03/14 全球购物
数学系毕业生的自我评价
2014/01/10 职场文书
会议室标语
2014/06/21 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
机动车交通事故协议书
2015/01/29 职场文书
物流业务员岗位职责
2015/04/03 职场文书
学困生转化工作总结
2015/08/13 职场文书
老舍《猫》教学反思
2016/02/17 职场文书