python入门学习:8.类

关键点:

8.1 创建和使用类8.2 使用类和实例8.3 继承8.4 导入类

8.1 创建和使用类

  面向对象编程是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。根据类来创建对象被称为实例化,这让你能够使用类。
8.1.1 创建dog类
  下面创建一个dog类:

 1calss Dog():
2
3    def __init__(self,name,age):
4        self.name = name
5        self.age = age
6
7    def sit(self):
8        print(self.name.title() + " is now sitting.")
9
10    def roll_over(self):
11        print(self.name.title() + " rolled over!")
  • 方法__init__():

  __init__()是一个特殊的方法,每当根据Dog类创建新实例时,python都会自动运行它。在这个方法中开头和结尾都是两个下划线,这是python的约定俗称。其中__init__()函数的定义中形参self是必不可少的,还必须位于其他参数前面。python调用__init__()创建Dog类实例时将自动传入实参self,每个与类相关联的方法调用都自动传入实参self,它是一个指向实例化本身的引用,然实例能够访问类中的属性和方法。

  • 在python2.7中创建类:
      在python2.7中创建类时,需要做些修改--在括号内包含单词object
1class ClassName(object):
2    --snip--

8.1.2 根据类创建实例
  这里使用的是前面创建的Dog类。我们创建一个实例my_dog,调用__init__()方法,并设置属性name和age。方法__init__()并未显示包含return语句,但是python自动返回一个表示小狗的实例给my_dog

1class Dog():
2    -- snip --
3
4my_dog = Dog('willie',6)#创建一个实例
5print("My dog's name is " + my_dog.name.title()+".")
6print("My dog's age is " + str(my_dog.age)+".")
  • 访问属性:
    my_dog.name
  • 调用方法:
    my_dog.sit()
    mt_dog.roll_over()
  • 创建多个实例
1my_dog = Dog('willie',6)#创建一个实例
2you_dog = Dog('lucy',5)#创建一个实例

8.2 使用类和实例

8.2.1 Car类
  下面编写一个汽车类

 1class Car():
2
3    def __init__(self,make,model,year):
4        self.make = make
5        self.model = model
6        self.year = year
7
8    def get_descriptive_name(self):
9        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
10        return long_name.title()
11
12my_new_car = Car('audi','a4',2016)
13print(my_new_car.get_descriptive_name())

8.2.2 修改属性的值

  • 直接修改属性值
 1class Car():
2
3    def __init__(self,make,model,year):
4        self.make = make
5        self.model = model
6        self.year = year
7        self.odometer_reading = 0
8
9    def get_descriptive_name(self):
10        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
11        return long_name.title()
12    def read_odometer(self):
13        print("This car has " + str(self.odometer_reading) + " miles on it.)
14my_new_car = Car('audi','a4',2016)
15print(my_new_car.get_descriptive_name())
16my_new_car.odometer_reading = 23   #直接修改
17my_new_car.read_odometer()
18
  • 通过方法修改属性值
 1class Car():
2
3    def __init__(self,make,model,year):
4        self.make = make
5        self.model = model
6        self.year = year
7        self.odometer_reading = 0;
8
9    def get_descriptive_name(self):
10        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
11        return long_name.title()
12
13    def read_odometer(self):
14        print("This car has " + str(self.odometer_reading)+ " miles on it.")
15
16    def update_odometer(self,mileage):
17        self.odometer_reading = mileage
18
19my_new_car = Car('audi','a4',2016)
20
21print(my_new_car.get_descriptive_name())
22#my_new_car.odometer_reading = 23
23my_new_car.update_odometer(23)   #通过方法修改属性
24my_new_car.read_odometer()

8.3 继承

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

  创建子类的实例时,python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法__init__()需要父类施以援手。

 1class Car():
2
3    def __init__(self,make,model,year):
4        self.make = make
5        self.model = model
6        self.year = year
7        self.odometer_reading = 0;
8
9    def get_descriptive_name(self):
10        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
11        return long_name.title()
12
13    def read_odometer(self):
14        print("This car has " + str(self.odometer_reading)+ " miles on it.")
15
16    def update_odometer(self,mileage):
17        self.odometer_reading = mileage
18
19class ElectricCar(Car):    #继承Car
20    def __init__(self,make,model,year):
21        #初始化父类的属性
22        super().__init__(make,model,year)  #关联父类和子类
23
24my_tesla = ElectricCar('tesla','model s',2016)
25print(my_tesla.get_descriptive_name())

8.3.2 给子类定义属性和方法
  给子类添加新的属性和方法

 1class Car():
2
3    def __init__(self,make,model,year):
4        self.make = make
5        self.model = model
6        self.year = year
7        self.odometer_reading = 0;
8
9    def get_descriptive_name(self):
10        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
11        return long_name.title()
12
13    def read_odometer(self):
14        print("This car has " + str(self.odometer_reading)+ " miles on it.")
15
16    def update_odometer(self,mileage):
17        self.odometer_reading = mileage
18
19
20class ElectricCar(Car):
21    def __init__(self,make,model,year):
22    #初始化父类的属性
23        super().__init__(make,model,year)
24        self.battery_size = 70    #新增加的属性在__init__()函数中修改
25
26    def describe_battery(self):   #新增加的方法
27        print("This car has a " + str(self.battery_size) + "-kwh battery.")
28
29my_tesla = ElectricCar('tesla','model s',2016)
30print(my_tesla.get_descriptive_name())
31my_tesla.describe_battery()

8.3.3 重写父类的方法
  对于父类的方法,子类可以对其重写。当创建一个实例对象调用该方法时会自动忽略父类方法。

 1class Car():
2
3    def __init__(self,make,model,year):
4        self.make = make
5        self.model = model
6        self.year = year
7        self.odometer_reading = 0;
8
9    def get_descriptive_name(self):
10        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
11        return long_name.title()
12
13    def read_odometer(self):
14        print("This car has " + str(self.odometer_reading)+ " miles on it.for car")
15
16    def update_odometer(self,mileage):
17        self.odometer_reading = mileage
18
19
20class ElectricCar(Car):
21    def __init__(self,make,model,year):
22    #初始化父类的属性
23        super().__init__(make,model,year)
24        self.battery_size = 70
25
26    def describe_battery(self):
27        print("This car has a " + str(self.battery_size) + "-kwh battery.")
28    def read_odometer(self): #重写
29        print("This car has " + str(self.odometer_reading)+ " miles on it. for ElectricCar") 
30my_tesla = ElectricCar('tesla','model s',2016)
31print(my_tesla.get_descriptive_name())
32my_tesla.describe_battery()
33my_tesla.read_odometer()     #调用子类

8.3.4 将实例用作属性
  使用代码模拟实物时,你可能会发现自己给自己添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为独立的类提取出来。可以将大类拆分成多个协同工作的小类。

 1class Car():
2
3    def __init__(self,make,model,year):
4        self.make = make
5        self.model = model
6        self.year = year
7        self.odometer_reading = 0;
8
9    def get_descriptive_name(self):
10        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
11        return long_name.title()
12
13    def read_odometer(self):
14        print("This car has " + str(self.odometer_reading)+ " miles on it.for car")
15
16    def update_odometer(self,mileage):
17        self.odometer_reading = mileage
18
19class Battery():
20    def __init__(self,battery_size=70):
21        self.battery_size = battery_size
22
23    def describe_battery(self):
24        print("This car has a " + str(self.battery_size) + "-kwh battery.")
25
26class ElectricCar(Car):
27    def __init__(self,make,model,year):
28        super().__init__(make,model,year)
29        self.battery = Battery()           #自动创建一个battery实例
30
31my_tesla = ElectricCar('tesla','model s',2016)
32print(my_tesla.get_descriptive_name())
33my_tesla.battery.describe_battery()   

8.4 导入类

8.4.1 导入单个类
  通过import导入类。from 模块名 import 类名

1from car import Car
2my_new_car = Car('audi','a4',2016)
3print(my_new_car.get_descriptive_name())
4my_new_car.odometer_reading = 23
5my_new_car.read_odometer()

8.4.2 从一个模块导入多个类
  通过import导入多个类,from 模块名 类1,类2

1from car import Car,ElectricCar
2my_tesla = ElectricCar('tesla','model s',2016)
3print(my_tesla.get_descriptive_name())
4my_tesla.battery.describe_battery() 
5my_tesla.battery.get_range()

8.4.3 导入整个模块
  导入整个模块:import 模块名

1import car
2my_beetle = car.Car('volkswagen','beetlw',2016)
3print(my_beetle.get_descriptive_name())
4my_tesla= car.ElectricCar('tesla','model s',2016)
5print(my_tesla.get_descriptive_name())

8.4.4 导入模块中的所有类
  导入模块中的所有类:from module_name import *
8.4.5 在一个模块中导入另一个模块
  有时候,需要将类分散到多个模块中,以避免模块过大,或在一个模块中存储不相关的类。将类类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类。在这种情况下,可在前一个模块中导入必要的类。

1#导入Car
2from car import Car 
3#导入 ElectricCar(electric_car 依赖car)
4from electric_car import ElectricCar 
5
6my_beetle = Car('volkswagen','beetle',2016)
7print(my_beetle.get_descriptive_name())
8my_tesla = Car('tesla','model s',2016)
9print(my_tesla.get_descriptive_name())

python入门学习:8.类的更多相关文章

  1. python入门学习:9.文件和异常

    python入门学习:9.文件和异常 关键点:文件.异常 9.1 从文件中读取数据9.2 写入文件9.3 异常9.4 存储数据 9.1 从文件中读取数据 9.1.1 读取整个文件  首先创建一个pi_ ...

  2. python入门学习:7.函数

    python入门学习:7.函数 关键点:函数 7.1 定义函数7.2 传递实参7.3 返回值7.4 传递列表7.5 传递任意数量的实参7.6 将函数存储在模块中 7.1 定义函数   使用关键字def ...

  3. python入门学习:6.用户输入和while循环

    python入门学习:6.用户输入和while循环 关键点:输入.while循环 6.1 函数input()工作原理6.2 while循环简介6.3 使用while循环处理字典和列表 6.1 函数in ...

  4. python入门学习:5.字典

    python入门学习:5.字典 关键点:字典 5.1 使用字典5.2 遍历字典5.3 嵌套 5.1 使用字典   在python中字典是一系列键-值对.每个键都和一个值关联,你可以使用键来访问与之相关 ...

  5. python入门学习:4.if语句

    python入门学习:4.if语句 关键点:判断 4.1 一个简单的测试4.2 条件测试4.3 if语句 4.1 一个简单的测试   if语句基本格式如下,注意不要漏了冒号 1if 条件 :2     ...

  6. python入门学习:3.操作列表

    python入门学习:3.操作列表 关键点:列表 3.1 遍历整个列表3.2 创建数值列表3.3 使用列表3.4 元组 3.1 遍历整个列表   循环这种概念很重要,因为它是计算机自动完成重复工作的常 ...

  7. python入门学习:2.列表简介

    python入门学习:2.列表简介 关键点:列表 2.1 列表是什么2.2 修改.添加和删除元素2.3 组织列表 2.1 列表是什么   列表,是由一系列按特定顺序排列的元素组成.你可以创建包含字母表 ...

  8. Python入门学习:1.变量和简单的数据类型

    python入门学习:1.变量和简单的数据类型 关键点:变量.字符串.数字 1.1 变量的命名和使用1.2 字符串1.3 数字1.4 注释 1.1 变量的命名和使用   变量,顾名思义是一个可变的量, ...

  9. Python入门学习之路,怎么 “开心,高效,踏实” 地把Python学好?兴趣,兴趣,兴趣!

    Python入门学习之路,怎么 “开心,高效,踏实” 地把Python学好?兴趣,兴趣,兴趣!找到你自己感兴趣的点进行切入,并找到兴趣点进行自我驱动是最好的学习方式!       推荐两本书,一本作为 ...

随机推荐

  1. tomcat中 server.xml

    tomcat服务器, 配置文件server.xml中的各项配置的意义 <?xml version="1.0" encoding="UTF-8"?> ...

  2. javascript算法-插入排序

    原理跟java那篇文章一样,只是语言不同而已 var InsertSort = function( _n ){ this.maxSize = _n; this.arr = []; this.init ...

  3. angular 用拦截器统一处理http请求和响应 比如加token

    想使用angularjs里的htpp向后台发送请求,现在有个用户唯一识别的token想要放到headers里面去,也就是{headres:{'token':1}} index.html里引入以下js: ...

  4. nodeJs express mongodb 建站(window 10 版)

    一.环境搭建 安装 node.git.npm.express.mongodb.主要介绍express.mongodb 的安装. (1)node安装:https://nodejs.org/en/down ...

  5. Vue2+VueRouter2+webpack 构建项目实战(三):配置路由,运行页面

    制作.vue模板文件 通过前面的两篇博文的学习,我们已经建立好了一个项目.问题是,我们还没有开始制作页面.下面,我们要来做页面了. 我们还是利用 http://cnodejs.org/api 这里公开 ...

  6. css小知识

    7. span { display:inline-block; width:70px; /* 超出长度以...显示 */ text-overflow: ellipsis; white-space: n ...

  7. JMeter 线程组之ConcurrencyThreadGroup介绍

    线程组之ConcurrencyThreadGroup by:授客 QQ:1033553122 测试环境 apache-jmeter-3.2 jmeter-plugins-manager-1.3.jar ...

  8. 2014/08/31 Zushi

    今天是逗子森户海滨浴场开放的最后一天,趁着最后的光景来这里透透气. 在学皮划艇准备下海的人们,貌似还挺有趣. 来自云端的上帝之手. 谁愿意和我一起向着夕阳弄桨. 夕阳西下,那里是家乡的方向. 灯塔和神 ...

  9. ASP.NET Core 入门教程 1、使用ASP.NET Core 构建第一个Web应用

    一.前言 1.本文主要内容 Visual Studio Code 开发环境配置 使用 ASP.NET Core 构建Web应用 ASP.NET Core Web 应用启动类说明 ASP.NET Cor ...

  10. svn状态与常见错误

    TortoiseSVN 1.6.16是最后一个目录独立管理自身cache的svn版本(每个目录下都有一个隐藏的.svn文件夹) 之后的版本会则会根目录上统一进行管理(只有根目录下有一个隐藏的.svn文 ...