python知识点总结(六):类

  面向对象编程是最有效的软件编写方法之一。根据类来创建对象被称为实例化,这让你能够使用类的实例。

1. 创建和使用类

  使用类几乎可以模拟任何东西。

(1)创建类

  方法    init    ():类中的函数称为方法。与前面学到的有关函数的一切都适用于方法,目前唯一重要的差别是调用方法的方式。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免 Python 默认方法与普通方法发生名称冲突。
编写一个表示小狗的简单类 Dog ——它表示的不是特定的小狗,而是任何小狗。

class Dog(): 
    def __init__(self, name, age):  #包含三个形参:self 、name 和age      
        self.name = name   #两个变量都有前缀self        
        self.age = age      
    def sit(self):  #由于该方法不需要额外的信息,只有一个形参self                
        print(self.name.title() + " is now sitting.")      
    def roll_over(self):                  
        print(self.name.title() + " rolled over!")

  形参 self 必不可少,还必须位于其他形参的前面。 Python 调用这个     init    () 方法来创建 Dog 实例时,将自动传入实参 self 。每个与类相关联的方法调用都自动传递实参 self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
  以 self 为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。self.name = name 获取存储在形参 name 中的值,并将其存储到变量 name 中,然后该变量被关联到当前创建的实例。像这样可通过实例访问的变量称为属性

(2)根据类创建实例
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)  #实例my_dog 
#使用句点表示法访问实例的属性my_dog.name
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
my_dog.sit()  #使用句点表示法来调用Dog类中定义的任何方法
my_dog.roll_over()

2. 使用类和实例

(1)给属性指定默认值

  类中的每个属性都必须有初始值,哪怕这个值是 0 或空字符串。在方法     init    () 内指定这种初始值是可行的;如果你对某个属性设置默认值时,就无需包含为它提供初始值的形参。

class Car(): 
    def __init__(self, make, model, year):        
        self.make = make          
        self.model = model
        self.year = year    
        self.record = 0   #设置默认值:里程数=0   
    def describe(self):   #汽车的特征
        name = str(self.year) + ' ' + self.make + ' ' + self.model
        return name.title()      
    def read_record(self):   #读取汽车的里程表               
        print("This car has " + str(self.record) + " miles on it!")
my_car = Car('audi','a4','2020')
print("My car: " + my_car.describe())
my_car.read_record()
(2)修改属性的值

  修改属性的值有三种不同的方式:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值)。
直接通过实例修改属性的值

class Car(): 
    def __init__(self, make, model, year):        
        self.make = make          
        self.model = model
        self.year = year    
        self.record = 0   #设置默认值:里程数=0   
    def describe(self):   #汽车的特征
        name = str(self.year) + ' ' + self.make + ' ' + self.model
        return name.title()      
    def read_record(self):   #读取汽车的里程表               
        print("This car has " + str(self.record) + " miles on it!")
my_car = Car('audi','a4','2020')
print("My car: " + my_car.describe())
my_car.record = 100  #直接将里程数设置为100
my_car.read_record()

通过方法修改属性的值

class Car(): 
    def __init__(self, make, model, year):        
        self.make = make          
        self.model = model
        self.year = year    
        self.record = 0   #设置默认值:里程数=0   
    def describe(self):   #汽车的特征
        name = str(self.year) + ' ' + self.make + ' ' + self.model
        return name.title()      
    def read_record(self):   #读取汽车的里程表               
        print("This car has " + str(self.record) + " miles on it!")
    def update_mile(self, mile):  #更新里程数
        if mile >= self.record:  #检查数值是否合理
            self.record = mile
        else:
            print("Wrong, the mileage has to be bigger!")
my_car = Car('audi','a4','2020')
print("My car: " + my_car.describe())
my_car.update_mile(100)
my_car.read_record()

通过方法对属性的值进行递增

class Car(): 
    def __init__(self, make, model, year):        
        self.make = make          
        self.model = model
        self.year = year    
        self.record = 0   #设置默认值:里程数=0   
    def describe(self):   #汽车的特征
        name = str(self.year) + ' ' + self.make + ' ' + self.model
        return name.title()      
    def read_record(self):   #读取汽车的里程表               
        print("This car has " + str(self.record) + " miles on it!")
    def update_mile(self, mile):  #更新里程数
        if mile >= self.record:  #检查数值是否合理
            self.record = mile
        else:
            print("Wrong, the mileage has to be bigger!")
    def increase_mile(self, mile):  #增加里程数
        self.record += mile
my_car = Car('audi','a4','2020')
print("My car: " + my_car.describe())
my_car.update_mile(100)
my_car.read_record()
my_car.increase_mile(10)  #增加10公里
my_car.read_record()

3. 继承

  编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

(1)子类的方法    init    ()

  子类的方法     init    () 需要父类施以援手。

class Car():   #父类
    def __init__(self, make, model, year):        
        self.make = make          
        self.model = model
        self.year = year    
        self.record = 0   #设置默认值:里程数=0   
    def describe(self):   #汽车的特征
        name = str(self.year) + ' ' + self.make + ' ' + self.model
        return name.title()      
    def read_record(self):   #读取汽车的里程表               
        print("This car has " + str(self.record) + " miles on it!")
    def update_mile(self, mile):  #更新里程数
        if mile >= self.record:  #检查数值是否合理
            self.record = mile
        else:
            print("Wrong, the mileage has to be bigger!")
    def increase_mile(self, mile):  #增加里程数
        self.record += mile

class ElectricCar(Car):  #子类:定义子类时,必须在括号内指定父类的名称
    def __init__(self, make, model, year):
        super().__init__(make, model, year) #函数super()让子类实例包含父类的所有属性

my_electric_car = ElectricCar('yadi','d5','2020')
print("My electric car: " + my_electric_car.describe())
(2)给子类定义属性和方法
class Car():   #父类
    def __init__(self, make, model, year):        
        self.make = make          
        self.model = model
        self.year = year    
        self.record = 0   #设置默认值:里程数=0   
    def describe(self):   #汽车的特征
        name = str(self.year) + ' ' + self.make + ' ' + self.model
        return name.title()      
    def read_record(self):   #读取汽车的里程表               
        print("This car has " + str(self.record) + " miles on it!")
    def update_mile(self, mile):  #更新里程数
        if mile >= self.record:  #检查数值是否合理
            self.record = mile
        else:
            print("Wrong, the mileage has to be bigger!")
    def increase_mile(self, mile):  #增加里程数
        self.record += mile

class ElectricCar(Car):  #子类:定义子类时,必须在括号内指定父类的名称
    def __init__(self, make, model, year):
        super().__init__(make, model, year) #函数super()让子类实例包含父类的所有属性
        self.battery_size = 50  #设置默认值:电瓶容量=50 
    def describe_battery(self):   #电动车容量
        print("This electric car has a " + str(self.battery_size) + " KWh battery!")

my_electric_car = ElectricCar('yadi','d5','2020')
print("My electric car: " + my_electric_car.describe())
my_electric_car.describe_battery()
(3)重写父类的方法

  对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。

#假设父类有一个fill_gas_tank()的方法
class ElectricCar(Car):  
    def __init__(self, make, model, year):
        super().__init__(make, model, year) 
    def fill_gas_tank():  #重写
        print("The electric car doesn't need a gas tank!")  #电动汽车没有油箱
(4)将实例用作属性

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

class Car():   #父类
    def __init__(self, make, model, year):        
        self.make = make          
        self.model = model
        self.year = year    
        self.record = 0   #设置默认值:里程数=0   
    def describe(self):   #汽车的特征
        name = str(self.year) + ' ' + self.make + ' ' + self.model
        return name.title()      
    def read_record(self):   #读取汽车的里程表               
        print("This car has " + str(self.record) + " miles on it!")
    def update_mile(self, mile):  #更新里程数
        if mile >= self.record:  #检查数值是否合理
            self.record = mile
        else:
            print("Wrong, the mileage has to be bigger!")
    def increase_mile(self, mile):  #增加里程数
        self.record += mile

class ElectricCar(Car):  #子类:定义子类时,必须在括号内指定父类的名称
    def __init__(self, make, model, year):
        super().__init__(make, model, year) #函数super()让子类实例包含父类的所有属性 
        self.battery = Battery()  #添加属性
    def fill_gas_tank():
        print("The electric car doesn't need a gas tank!") #电动汽车没有油箱

#将属性和方法提取出来放到Battery类中,并将Battery实例用作ElectricCar类的一个属性
class Battery():  
    def __init__(self, battery_size=70):
        self.battery_size = battery_size
    def describe_battery(self):   #电动车容量
        print("This electric car has a " + str(self.battery_size) + " KWh battery!")
        
my_electric_car = ElectricCar('yadi','d5','2020')
print("My electric car: " + my_electric_car.describe())
my_electric_car.battery.describe_battery()

4. 导入类

  随着你不断地给类添加功能,文件可能变得很长,即便你妥善地使用了继承亦如此。为让文件尽可能整洁可将类存储在模块中,然后在主程序中导入所需的模块。

(1)导入单个类

  将 Car 类存储在一个名为 car.py 的模块中,然后在 my_car.py 文件中导入 Car 类:

from car import Car
my_car = Car('audi','a4','2020')
print("My car: " + my_car.describe())
my_car.update_mile(100)
my_car.read_record()
(2)在一个模块中存储多个类

  虽然同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块中存储任意数量的类。可将 Car 类、Battery 类、ElectricCar 类等存储在 car.py 的模块中。

(3)从一个模块中导入多个类

  可根据需要在程序文件中导入任意数量的类。

from car import Car, ElectricCar
(4)导入整个模块

  你还可以导入整个模块,再使用句点表示法访问需要的类。

import car
my_car = car.Car('audi','a4','2020')
print("My car: " + my_car.describe())
my_electric_car = car.ElectricCar('yadi','d5','2020')
print("My electric car: " + my_electric_car.describe())
(5)导入模块中的所有类

  from 模块名 import *
  不推荐使用这种导入方式,其原因有二:
  一、这种导入方式没有明确地指出你使用了模块中的哪些类。
  二、这种导入方式还可能引发名称方面的困惑。如果你不小心导入了一个与程序文件中其他东西同名的类,将引发难以诊断的错误。

(6)在一个模块中导入另一个模块

  将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类。在这种情况下,可在前一个模块中导入必要的类。
  例如:将 Car 类存储在一个模块中 car.py,并将 ElectricCar 和 Battery 类存储在另一个模块中 electric_car.py。ElectricCar 类需要访问其父类 Car,因此直接将 Car 类导入 electric_car.py 中。

5. Python标准库

  Python 标准库是一组模块,安装的 Python 都包含它,可使用标准库中的任何函数和类。如,模块 collections 中的一个类 OrderedDict,OrderedDict 实例记录了字典中键值对的添加顺序。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值