Python编程学习笔记(六)

九、类

1.创建和使用类

(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.")

#根据类创建实例
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.

  类中的函数(__init__,sit, roll_over)统称为方法。在这个方法的定义中,形参self 必不可少,还必须位于其他形参的前面。当Python根据类创建实例时,会自动传入实参self,所以我们不必给形参self提供值。
(2)根据类创建实例

  • 访问属性
my_dog=Dog('willie',6)
print(my_dog.name)

 输出结果:

willie
  • 调用方法
my_dog=Dog('willie',6)
my_dog.sit()
my_dog.roll_over()

 输出结果:

Willie is now sitting.
Willie rolled over.
  • 创建多个实例
my_dog=Dog('willie',6)
your_dog=Dog('lucky',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("\nYpur dog's name is "+ your_dog.name.title() +".")
print(your_dog.name.title()+" is "+ str(your_dog.age) +" years old.")
your_dog.roll_over()

 输出结果:

My dog's name is Willie.
My dog is 6 years old.
Willie is now sitting.

Ypur dog's name is Lucky.
Lucky is 3 years old.
Lucky rolled over.

2.使用类和实例

(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',2016)
print(my_new_car.get_descriptive_name())

输出结果:

2016 Audi A4

(2)给属性指定默认值
  给里程数指定默认值0

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_dodmeter(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_dodmeter()

输出结果:

2016 Audi A4
This car has 0 miles on it.

(3)修改属性的值

  • 直接修改属性的值
my_new_car=Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading=23
my_new_car.read_dodmeter()

 输出结果:

2016 Audi A4
This car has 23 miles on it.
  • 通过方法修改属性的值
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_dodmeter(self,mileage):
        
        """禁止将里程表读数往回调"""
        if mileage >= self.odometer_reading:
            self.odometer_reading=mileage
            """打印一条指出汽车里程的消息"""
            print("This car has "+ str(self.odometer_reading) +" miles on it.")
        else:
            print("You can't roll back an odometer!")
            


my_used_car=Car('audi','a4',2016)
print(my_used_car.get_descriptive_name())

my_used_car.read_dodmeter(10500)

my_used_car.read_dodmeter(300)

 输出结果:

2016 Audi A4
This car has 10500 miles on it.
You can't roll back an odometer!
  • 通过方法对属性的值进行递增
    def increment_odometer(self,miles):
        self.odometer_reading += miles
        print("This car has "+ str(self.odometer_reading) +" miles on it.")

my_used_car=Car('audi','a4',2016)
print(my_used_car.get_descriptive_name())

my_used_car.read_odometer(10500)
my_used_car.read_odometer(3000)

my_used_car.increment_odometer(500)

 输出结果:

2016 Audi A4
This car has 10500 miles on it.
You can't roll back an odometer!
This car has 11000 miles on it.

3.继承

子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
(1)子类的方法__init__()
  创建子类时,父类必须包含在当前文件中,且位于子类前面。
  super() 是一个特殊函数,帮助Python将父类和子类关联起来。

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.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
    def increment_odometer(self, miles):
        self.odometer_reading += miles


class ElectricCar(Car):   #括号内指定父类的名称
    """电动车的独特之处"""

    def __init__(self,make,model,year):
        """初始化父类的属性"""
        super().__init__(make,model,year)


my_tesla = ElectricCar('tesla','model s',2017)
print(my_tesla.get_descriptive_name())

输出结果:

2017 Tesla Model S

(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',2017)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()

输出结果:

2017 Tesla Model S
This car has a 70-kwh battery.

(3)重写父类的方法 取其精华,弃其糟粕

class ElectricCar(Car):
    """电动车的独特之处"""

    def __init__(self,make,model,year):
        """初始化父类的属性"""
        super().__init__(make,model,year)
        self.battery_size = 70
        self.odometer_reading = 1000

    def describe_battery(self):
        """打印一条描述电瓶容量的消息"""
        print("This car has a " + str(self.battery_size) +"-kwh battery.")

    def read_odometer(self):
        #继承父类的方法
        super().read_odometer()
        
    def increment_odometer(self):
        #重写父类的方法
        print("This electric can't be driven.")


my_tesla = ElectricCar('tesla','model s',2017)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
my_tesla.read_odometer()
my_tesla.increment_odometer()

输出结果:

2017 Tesla Model S
This car has a 70-kwh battery.
This car has 1000 miles on it.
This electric can't be driven.

(4)将实物用作属性
可以将类的一部分作为一个独立的类提取出来,从而将大型类拆分成多个协同工作的小类。

class Battery():  #不继承任何类
    """一次模拟电动汽车电瓶的简单尝试"""
    def __init__(self,battery_size=70):
        """初始化电瓶的属性"""
        self.battery_size=battery_size
        
    def describe_battery(self):
        """打印一条描述电瓶容量的消息"""
        print("\nThis car has a " + str(self.battery_size) +"-kwh battery.")

    def get_range(self):
        """打印一条消息,指出电瓶车的续航里程"""
        if self.battery_size == 70:
            range = 240
        elif self.battery_size == 80:
            range = 270

        message ="This car can go approximately "+ str(range)
        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()



my_tesla = ElectricCar('tesla','model s',2017)
print(my_tesla.get_descriptive_name())

my_tesla.battery.__init__(80)
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()

输出结果:

2017 Tesla Model S

This car has a 80-kwh battery.
This car can go approximately 270 miles on a full charge.

4.导入类

(1)导入单个类
 首先创建car.py
 然后创建my_car.py,在其中导入Car类并创建其实例:

from car import Car

my_new_car=Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 24
my_new_car.read_odometer()

my_new_car.increment_odometer(500)
my_new_car.read_odometer()

输出结果:

2016 Audi A4
This car has 24 miles on it.
This car has 524 miles on it.

(2)在一个模块中存储多个类
car0.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.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
    def increment_odometer(self, miles):
        self.odometer_reading += miles


class Battery():  
    """一次模拟电动汽车电瓶的简单尝试"""
    def __init__(self,battery_size=70):
        """初始化电瓶的属性"""
        self.battery_size=battery_size
        
    def describe_battery(self):
        """打印一条描述电瓶容量的消息"""
        print("\nThis car has a " + str(self.battery_size) +"-kwh battery.")

    def get_range(self):
        """打印一条消息,指出电瓶车的续航里程"""
        if self.battery_size == 70:
            range = 240
        elif self.battery_size == 80:
            range = 270

        message ="This car can go approximately "+ str(range)
        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()

my_electric_car.py

from car0 import ElectricCar

my_tesla = ElectricCar('tesla','model s',2017)
print(my_tesla.get_descriptive_name())

my_tesla.battery.describe_battery()
my_tesla.battery.get_range()

输出结果:

2017 Tesla Model S

This car has a 70-kwh battery.
This car can go approximately 240 miles on a full charge.

(3)从一个模块中导入多个类
 将Car 和ElectricCar 类都导入my_cars.py

from car0 import Car,ElectricCar

my_beetle = Car('volkswagen','beetle',2018)
print(my_beetle.get_descriptive_name())

my_tesla = ElectricCar('tesla','roadster',2019)
print(my_tesla.get_descriptive_name())

输出结果:

2018 Volkswagen Beetle
2019 Tesla Roadster

(4)导入整个模块
my_cars.py

import car0

my_beetle = car0.Car('volkswagen','beetle',2018)
print(my_beetle.get_descriptive_name())

my_tesla = car0.ElectricCar('tesla','roadster',2019)
print(my_tesla.get_descriptive_name())

(5)导入模块中的所有类(不推荐) from module_name import *
(6)在一个模块中导入另一个模块
car.py
electric_car.py

from car import Car

class Battery(): 
    ...
class ElectricCar(Car):
    ...

my_cars.py

from electric_car import ElectricCar

my_tesla = ElectricCar('tesla','roadster',2019)
print(my_tesla.get_descriptive_name())

5.Python标准库

以模块collections 中的一个类——OrderedDict(记录了键—值对的添加顺序的字典)为例:

#导入类
from collections import OrderedDict

#创建一个实例
favorite_languages = OrderedDict()  #调用OrderDict()来创建一个空的有序字典

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编程:从入门到实践

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值