class——python编程从入门到实践
创建和使用类
1. 创建Dog类
class Dog:
"""一次模拟小狗的简单尝试""" def __init__(self, name, age):
"""初始化属性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!")
编程趣事:上边的代码敲完之后,想试一下能不能用,就添加了一个实例运行了一下,结果一直报错:takes no arguments,检查和比较了好几遍,都一样呀,哪里的问题呢?结果把 init 敲成了 int ,但是在PyCharm和IDLE都显示正常,太神奇啦!
言归正传:Python中首字母大写的名称指的是类;类中的函数成为方法;__init__(self, )是默认方法;默认方法中形参self必须存在且位于最前边,但创建实列时不需要提供值;以self为前缀的变量都可供类中的所有方法使用,还可通过实例访问。
2. 根据类创建实例
my_dog = Dog('willie', 6) # 类实例,实例名称用小写
your_dog = Dog('lucy', 3) # 再创建一个实例
print("My dog's name is " + my_dog.name.title() + ".") # 用点句法访问属性
print("My dog is " + str(my_dog.age) + " years old.")
my_dog.sit() # 调用方法
print("\nYour dog's name is " + your_dog.name.title() + ".") # 用点句法访问属性
print("Your dog is " + str(your_dog.age) + " years old.")
my_dog.roll_over() # 调用方法
使用类和实例
1. Car类
class Car:
"""一次模拟汽车的简单尝试""" def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year def get_descriptive_name(self):
"""返回整洁的描述性信息"""
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title() my_new_car = Car('audi', 'a4', '') # 创建实例
print(my_new_car.get_descriptive_name()) # 调用类的方法
2. 给属性指定默认值
class Car:
"""一次模拟汽车的简单尝试""" def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 # 给属性指定默认值 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', '')
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer() # 访问类方法
3. 修改属性的值
class Car:
"""一次模拟汽车的简单尝试""" def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 # 给属性指定默认值 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 = self.odometer_reading + miles my_new_car = Car('audi', 'a4', '')
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer() my_new_car.odometer_reading = 23 # 直接修改属性的值
my_new_car.read_odometer() my_new_car.update_odometer(66) # 通过方法修改属性
my_new_car.read_odometer() my_new_car.increment_odometer(100) # 通过方法对属性的值递增
my_new_car.read_odometer()
继承
要编写的类时另一个现成类的特殊版本,就使用继承。一个类继承另一个类时,它将自动获得另一个类的属性和方法;原有的类称为父类,而新的类称为子类。子类继承父类的所有属性和方法,同时还可以定义自己的属性和方法。
1. 子类的方法__init__( )
class ElectricCar(Car): # 创建子类,括号中包含父类的名称
"""电动汽车的独特之处""" def __init__(self, make, model, year): # 接受创建Car实例所需的信息
"""初始化父类的属性"""
super().__init__(make, model, year) # 将子类和父类关联起来,让子类包含父类所有属性。由此父类也称为超类(superclass) my_tesla = ElectricCar('tesla', 'model s', 2019) # 创建一个实例存储于变量中
print(my_tesla.get_descriptive_name())
Note: 创建子类时,父类必须包含再当前文件中,且位于子类前边。
2. 给子类定义属性和方法
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', 2019)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
3. 重写父类的方法
在子类中定义一个与父类中方法同名的方法——重写父类的方法。
4. 将实例用作属性
class Battery: # 定义新类
"""一次模拟电动汽车电瓶的简单尝试""" def __init__(self, battery_size=85):
"""初始化电瓶属性"""
self.battery_size = battery_size def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "kwh battery.") def get_range(self): # 新增方法
"""打印一条消息,指出电瓶的续航里程"""
if self.battery_size == 70:
range = 240
elif self.battery_size == 85:
range = 270 message = "This car can go approximately " + str(range)
message = message + " miles on a full charge."
print(message) class ElectricCar(Car):
"""电动汽车的独特之处""" def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
self.battery = Battery() # 创建一个新的Battery实例,并将该实例存储在属性中 my_tesla = ElectricCar('tesla', 'model s', 2019)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery() # 在实例my_tesla中查找属性battery,并对存储在该属性中的Battery实例调用方法describe_battery()
my_tesla.battery.get_range() # 继续通过属性中的实例调用方法
导入类
不断的给类添加新的功能,文件会变得越来越长,即便使用了继承也是如此。为了让文件尽可能整洁,可以将类存储在模块中,然后再在主程序中导入所需的模块。
1. 导入单个模块
car.py
"""一个可用于表示汽车的类""" class Car:
"""一次模拟汽车的简单尝试""" def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 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):
"""
将里程数设为指定的值
拒绝将里程表往回拨
"""
if mileage >= self.get_descriptive_name():
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!") def increment_odometer(self, miles):
"""将里程读数增加指定量"""
self.odometer_reading = self.odometer_reading + miles
my_car.py
from car import Car #导入类
my_new_car = Car('audi', 'a4', 2019)
print(my_new_car.get_descriptive_name()) my_new_car.odometer_reading = 23
my_new_car.read_odometer()
2. 在一个模块中存储多个类
在car.py中添加以下代码:
class Battery:
"""一次模拟电动汽车电瓶的简单尝试""" def __init__(self, battery_size=85):
"""初始化电瓶属性"""
self.battery_size = battery_size def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "kwh battery.") def get_range(self): # 新增方法
"""打印一条消息,指出电瓶的续航里程"""
global rg
if self.battery_size == 70:
rg = 240
elif self.battery_size == 85:
rg = 270 message = "This car can go approximately" + str(rg)
message = message + " miles on a full charge."
print(message) class ElectricCar(Car):
"""电动汽车的独特之处""" def __init__(self, make, model, year):
"""初始化父类的属性""" super().__init__(make, model, year)
self.battery = Battery()
此时car.py中包含3个类,可以单独导出其中的一个类使用:
my_electric_car.py
from car import ElectricCar
my_tesla = ElectricCar('tesla', 'roadster', 2019)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
3. 从一个模块导入多个类
my_cars.py
from car import Car, ElectricCar #导入一个模块中的两个类
my_beetle = Car('volkswagen', 'beetle', 2019)
print(my_beetle.get_descriptive_name())
my_tesla = ElectricCar('tesla', 'roadster', 2019)
print(my_tesla.get_descriptive_name())
4. 导入整个模块
my_cars.py
import car
my_beetle = car.Car('volkswagen', 'beetle', 2019)
print(my_beetle.get_descriptive_name())
my_tesla = car.ElectricCar('tesla', 'roadster', 2019)
print(my_tesla.get_descriptive_name())
5. 导入模块中的所有类
导入模块中的所有类,可使用一下语法:
from module_name import *
但是,不推荐使用这种导入方式,避免引发名称冲突。
6. 在一个模块中导入另一个模块
若将Car类存储在一个模块car.py中,将ElectricCar和Battery类存储在模块electriic_car.py中:
electriic_car.py
from car import Car class Battery:
...
class ElectricCar(Car)
...
my_cars.py
from car import Car
from electriic_car my_beetle = Car('volkswagen', 'beetle', 2019)
print(my_beetle.get_descriptive_name()) my_tesla = ElectricCar('tesla', 'roadster', 2019)
print(my_tesla.get_descriptive_name())
class——python编程从入门到实践的更多相关文章
- Python编程从入门到实践笔记——异常和存储数据
Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...
- Python编程从入门到实践笔记——文件
Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...
- Python编程从入门到实践笔记——类
Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...
- Python编程从入门到实践笔记——函数
Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...
- Python编程从入门到实践笔记——用户输入和while循环
Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...
- Python编程从入门到实践笔记——字典
Python编程从入门到实践笔记——字典 #coding=utf-8 #字典--放在{}中的键值对:跟json很像 #键和值之间用:分隔:键值对之间用,分隔 alien_0 = {'color':'g ...
- Python编程从入门到实践笔记——if语句
Python编程从入门到实践笔记——if语句 #coding=utf-8 cars=['bwm','audi','toyota','subaru','maserati'] bicycles = [&q ...
- Python编程从入门到实践笔记——操作列表
Python编程从入门到实践笔记——操作列表 #coding=utf-8 magicians = ['alice','david','carolina'] #遍历整个列表 for magician i ...
- Python编程从入门到实践笔记——列表简介
Python编程从入门到实践笔记——列表简介 #coding=utf-8 #列表——我的理解等于C语言和Java中的数组 bicycles = ["trek","cann ...
- Python编程从入门到实践笔记——变量和简单数据类型
Python编程从入门到实践笔记——变量和简单数据类型 #coding=gbk #变量 message_1 = 'aAa fff' message_2 = 'hart' message_3 = &qu ...
随机推荐
- 在x64计算机上捕获32位进程的内存转储
这是一个我经常遇到的问题,我们经常会遇到这样的情况:我们必须重新捕获内存转储,因为内存转储是以“错误”的方式捕获的.简而言之:如果在64位计算机上执行32位进程,则需要使用允许创建32位转储的工具捕获 ...
- 【UVA11987】Almost Union-Find
题目链接 题目就告诉我们要用并查集了,操作1和3用裸的带权并查集就行了, 操作2相当于将p结点从当前树中删除,再插入到q的树中,直接删除的话比较麻烦,不妨把它的"尸体"留在原来的地 ...
- 洛谷P1799 数列[NOI导刊]
题目 dp状态定义的好题,初看这个题其实并不好想到他的状态,但是可以根据状态的定义,需要满足最优子结构.还有比较重要的一点就是方便转移方程. 首先我们定义dp[i]表示前i个数所能得到的最多个数,发现 ...
- 我的Android前生今世之缘-学习经验-安卓入门教程(六)
关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 据我所知,网上教学资料一堆一堆的,那么还有很多人说,如何学习? ...
- Approximate Search
题目链接:Gym-101492H 动态规划,应该是比较基础的,可是自己就是不会QAQ.... /* 把使用机会当成“花费” */ # include <iostream> # includ ...
- 使用javascript获取父级元素
之前jquery用多了习惯了它那简洁的写法,后来使用ES6进行编写的时候,需要使用类似$(this).parent();来获取点击元素所属的父级元素时发现,es6中的class下的this指向是cla ...
- 高斯混合模型(GMM)及MATLAB代码
之前在学习中遇到高斯混合模型,卡了很长一段时间,在这里记下学习中的一些问题以及解决的方法.希望看到这篇文章的同学们对高斯混合模型能有一些基本的概念.全文不废话,直接上重点. 本文将从以下三个问题详解高 ...
- nginx重启 平滑重启
进入 ngiinx sbin目录下./nginx -c /usr/local/nginx/conf/nginx.conf -c参数指定了要加载的nginx配置文件路径 停止操作停止操作是通过向ngin ...
- Git提交(PUSH)时记住密码 - 不用每次都输入密码
开发使用的团队搭建好的GitLab服务器来作为项目共享开发,由于我不是最高权限,没办法把我git生成的SSH-Key放到服务器里面去,所有只好在每次提交的时候配置git config来记录密码不过期来 ...
- JAVA从服务器下载文件根据Url把多文件打包成ZIP下载
注意: 1. String filename = new String(“xx.zip”.getBytes(“UTF-8”), “ISO8859-1”);包装zip文件名不发生乱码. 2.一定要注意 ...