深入浅析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 23 Python
pandas带有重复索引操作方法
Jun 08 Python
python学生信息管理系统(初级版)
Oct 17 Python
Python多进程fork()函数详解
Feb 22 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
Python3 翻转二叉树的实现
Sep 30 Python
python实现根据文件格式分类
Oct 31 Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 Python
Python中bisect的使用方法
Dec 31 Python
python numpy实现rolling滚动案例
Jun 08 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
解决pytorch读取自制数据集出现过的问题
May 31 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下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
thinkPHP线上自动加载异常与修复方法实例分析
2016/12/01 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
9个JavaScript评级/投票插件
2010/01/18 Javascript
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
js实现双色球效果
2020/08/02 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
Python键盘输入转换为列表的实例
2018/06/23 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
django迁移数据库错误问题解决
2019/07/29 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
python使用建议与技巧分享(二)
2020/08/17 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
python识别验证码的思路及解决方案
2020/09/13 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
德国团购网站:Groupon德国
2018/03/13 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
小学老师寄语大全
2014/04/04 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python