python学习之路(八)-类

学习来源于《Python编程:从入门到实践》,感谢本书的作者和翻译工作者。

下面为学习笔记

class Dog():  #1
# """一次模拟小狗的简单尝试""" 2
    def __init__(self, name, age):#3
# """初始化属性name和age"""
        self.name = name #4
        self.age = age
    def sit(self): #5
# """模拟小狗被命令时蹲下"""
        print(self.name.title() + " is now sitting.")
    def roll_over(self):
# """模拟小狗被命令时打滚"""
        print(self.name.title() + " rolled over!")
#1. 方法__init__()
# 类中的函数称为方法;你前面学到的有关函数的一切都适用于方法,就目前而言,唯一重要
# 的差别是调用方法的方式。 3处的方法__init__()是一个特殊的方法,每当你根据Dog类创建新实
# 例时, Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约
# 定,旨在避免Python默认方法与普通方法发生名称冲突。
# 我们将方法__init__()定义成了包含三个形参: self、 name和age。在这个方法的定义中,形
# 参self必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参self呢?因为
# Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法
# 调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
# 我们创建Dog实例时, Python将调用Dog类的方法__init__()。我们将通过实参向Dog()传递名字和
# 年龄; self会自动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最
# 后两个形参( name和age)提供值。
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.sit()
my_dog.roll_over()
class Car():
# """一次模拟汽车的简单尝试"""
    def __init__(self, make, model, year):
# """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
    def update_odometer(self, mileage):
# """将里程表读数设置为指定的值"""
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
    def increment_odometer(self, miles):
# """将里程表读数增加指定的量"""
        self.odometer_reading += miles
    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.odometer_reading = 23
my_new_car.read_odometer()
my_new_car.update_odometer(23)
my_new_car.read_odometer()
my_used_car = Car('subaru', 'outback', 2013)
print(my_used_car.get_descriptive_name())
my_used_car.update_odometer(23500)
my_used_car.read_odometer()
my_used_car.increment_odometer(100)
my_used_car.read_odometer()
# 创建子类时,父类必须包含在当前文件中,且位于子类前面。
# 在1处,我们定义了子类ElectricCar。 定义子类时,必须在括号内指定父类的名称。方法__init__()
# 接受创建Car实例所需的信息(见)。
class ElectricCar(Car): #1
# """电动汽车的独特之处"""
    def __init__(self, make, model, year):
# """初始化父类的属性"""
        super().__init__(make, model, year) #处的super()是一个特殊函数,帮助Python将父类和子类关联起来。
# 这行代码让Python调用
# ElectricCar的父类的方法__init__(),让ElectricCar实例包含父类的所有属性。父类也称为超
# 类( superclass),名称super因此而得名。
        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()
# 假设Car类有一个名为fill_gas_tank()的方法,它对全电动汽车来说毫无意义,因此你可能
# 想重写它。def fill_gas_tank():
# """电动汽车没有油箱"""
# print("This car doesn't need a gas tank!")
# 现在,如果有人对电动汽车调用方法fill_gas_tank(), Python将忽略Car类中的方法
# fill_gas_tank(),转而运行上述代码。
class Battery():
#"""一次模拟电动汽车电瓶的简单尝试"""
    def __init__(self, battery_size=70):
# """初始化电瓶的属性"""
        self.battery_size = battery_size
    def get_range(self):
#"""打印一条消息,指出电瓶的续航里程"""
        if self.battery_size == 70:
            range1 = 240
        elif self.battery_size == 85:
            range1 = 270
        message = "This car can go approximately " + str(range1)
        message += " miles on a full charge."
        print(message)
    def describe_battery(self):
# """打印一条描述电瓶容量的消息"""
        print("This car has a " + str(self.battery_size) + "-kWh battery.")
class ElectricCar1(Car):
#"""电动汽车的独特之处"""
    def __init__(self, make, model, year):
# 初始化父类的属性,再初始化电动汽车特有的属性
        super().__init__(make, model, year)
        self.battery = Battery()
my_tesla1 = ElectricCar1('tesla', 'model s', 2016)
print(my_tesla1.get_descriptive_name())
my_tesla1.battery.describe_battery()#创建一个新的Battery实例(由于没有指定尺寸,因此为默认值70),
# 并将该实例存储在属性self.battery中。
my_tesla1.battery.get_range()
# 将Car类存储在一个名为car.py的模块中
# 下面来创建另一个文件——my_car.py,在其中导入Car类并创建其实例:
# from car import Car .import语句让Python打开模块car,并导入其中的Car类。这样我们就可以使用Car类了

# 可根据需要在程序文件中导入任意数量的类。
# from car import Car, ElectricCar

# 你还可以导入整个模块,再使用句点表示法访问需要的类。这种导入方法很简单,代码也易
# 于阅读。
# import car
# my_beetle = car.Car('volkswagen', 'beetle', 2016)
# print(my_beetle.get_descriptive_name())
# my_tesla = car.ElectricCar('tesla', 'roadster', 2016)
# print(my_tesla.get_descriptive_name())

# 要导入模块中的每个类,可使用下面的语法:
# from module_name import *

# 有时候,需要将类分散到多个模块中,以免模块太大,或在同一个模块中存储不相关的类。
# 将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类。在这种情况
# 下,可在前一个模块中导入必要的类。

# 字典让你能够将信息关联起来,但它们不记录你添加键—值对的顺序。要创建字典并记录其
# 中的键—值对的添加顺序,可使用模块collections中的OrderedDict类。 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() + ".")

猜你喜欢

转载自blog.csdn.net/mugong11/article/details/81284126