Python学习笔记7—类

2017-12-19  本文已影响0人  肉松饼饼

面向对象编程是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,定义一个大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。根据类来创建对象被称为实例化,这让你能够使用类的示例。

一、创建和使用类

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

1、创建类

dog.py

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

注:

在Python 2.7中国创建类时,应在括号内包含单词object

class ClassName(object):

2、根据类创建实例

class Dog():
    --snip--

my_dog = Dog('Bob',2)
print("My dog's name is " + my_dog.name.title() +".")

约定:首字母大写的名称指的是类,小写的名称指的是根据类创建的实例。

① 访问属性(句点表示法)

my_dog.name

② 调用方法(句点表示法)

my_dog.sit()

③ 创建多个实例

my_dog = Dog('Bob',2)
your_dog = Dog('Mei',3)

二、使用类和实例

类编写好之后,你的大部分时间都将花在使用根据类创建的实例上。你需要执行的一个重要任务是修改实例的属性,可以直接修改实例的属性,也也可以编写方法以特定的方式进行修改。

1、给属性指定默认值

class Dog():
    """一次模拟小狗的简单测试"""
    def __init__(self,name,age):
        """初始化属性name和age"""
        self.name = name
        self.age = age
        self.color = 'yellow'

    def sit(self):
        """模拟小狗被命令时蹲下"""
        print(self.name.title() + " is now sitting."

2、修改属性的值

① 直接修改属性的值

要修改属性的值,最简单的方式时通过实例直接访问它,然后修改属性值。

my_dog.color = 'red'

② 通过方法修改属性的值

将要修改的值传递给一个方法,由它在内部进行修改。

class Dog():
    --snip--

    def update_color(self,color):
        """修改宠物的颜色"""
        self.color = 'color'

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

有时候需要将属性值递增特定的量,而不是将其设置为全新的值。

三、继承

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

1、子类的方法 __ init __ ()

class Dog():
    --snip--

class BabyDog(Dog):
    """婴儿狗的特殊之处"""
    
    def __init__(self,name,age):
        """初始化父类的属性"""
        super().__init__(name,age)

注:

2、python 2.7中的继承

class Dog(object):
    def __init__(self,name,age):
        --snip--

class BabyDog(Dog):
    def __init__(self,name,age):
        super(Dog,self).__init__(name,age)
        --snip--

3、给子类定义属性和方法

class Dog():
    --snip--

class BabyDog(Dog):
    """婴儿狗的特殊之处"""
    
    def __init__(self,name,age,mother_name):
        """初始化父类的属性,再初始化婴儿狗的特有属性"""
        super().__init__(name,age)
        self.mother_name = mother_name

    def show_mother_name(self,mother_name):
        """打印婴儿狗的麻麻的名字"""
        print("This baby dog's name is " + self.name +" and it's mother is " 
              + self.mother_name + ".")

4、重写父类的方法

对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个与要重写父类方法同名的方法。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的响应方法。

5、将实例用作属性

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

class Car():
    --snip--

class Battery():
      --snip-

class ElectricCar(Car):
    """电动汽车的独特之处"""
    def __init__(self,make,modle,year):
        super().__init__(make,modle,year)
        self.battery = Battery()

ElectricCar类中,添加了一个名为self.battery的属性,这行代码让Python创建一个新的Battery实例,并将该实例存储在属性self.battery中。每当方法__init__()被调用时,都将执行该操作。因此现在每个ElectricCar实例都包含一个自动创建的Battery实例。

四、导入类

随着你不断地给类添加功能,文件可能变得很长,为此,可将类存储在模块中,然后在主程序中导入所需的模块。

1、导入单个类

dog.py

"""一个可用于表示狗的类"""

class Dog():
    --snip--

注:三引号引起来的是模块级文档字符串,对该模块的内容进行简单的描述。
my_dog.py

from dog import Dog

my_dog = Dog('bob',2)

2、在一个模块中存储多个类

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

"""一组用于表示燃油汽车和电动汽车的类"""

class Car():
    --snip--

class Battery():
    --snip--

class ElectricCar(Car):
    --snip--

3、从一个模块中导入多个类

my_cars.py

from car import Car,ElectricCar

4、导入整个模块

导入整个模块,再使用句点表示法访问需要的类。由于创建类实例的代码都包含模块名,因此不会与当前文件使用的任何名称发生冲突。

import car

my_beetle = car.Car('volkswagen','beetle',2016)
my_tesla = car.ElectricCar('tesla','roadster',2017)

5、导入模块中的所有类

from module_name import *

但是,不推荐使用这种导入方法。

6、在一个模块中导入另一个模块

有时候需要将类分散到多个模块中,一面模块过大,或在同一个模块中国存储不相关的类。此时,可能一个模块的类依赖另一个模块中的类。
electric_car.py

"""一组可用来表示电动汽车的类"""

from car import Car

class ElectricCar(Car):
    --snip--

car.py

"""一个可用来表示汽车的类"""
class Car():
    --snip--

my_cars.py

from car import Car 
from electric_car import ElectricCar

--snip--

五、类编码风格

上一篇下一篇

猜你喜欢

热点阅读