1. 在类的 __init__() 方法中,self 形参必不可少还必须位于其他行参的前面:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    """汽车类,存储有关汽车的信息.

    author: geekwang
    date: 2016/08/29
    """


    class Car(object):
    """一次模拟汽车的简单尝试."""

    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())
  1. 为类中的属性指定默认值

    类中的每个属性都必须有初始值,有些情况下在方法 __init__() 中指定属性的初始值是可行的,无需包含为它提供初始值的行参:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    """汽车类,存储有关汽车的信息.

    author: geekwang
    date: 2016/08/29
    """


    class Car(object):
    """一次模拟汽车的简单尝试."""

    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', 2016)
    print(my_new_car.get_descriptive_name())
    my_new_car.read_odometer()
  2. 创建子类时,父类必须包含在当前文件中,且位于子类的前面,子类必须在括号内指定父类的名称:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    """汽车类,存储有关汽车的信息.

    author: geekwang
    date: 2016/08/29
    """


    class Car(object):
    """一次模拟汽车的简单尝试."""

    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

    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)
    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()
  3. 对于父类的方法,只要不符合子类模拟的实物的行为,都可以对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    """汽车类,存储有关汽车的信息.

    author: geekwang
    date: 2016/08/29
    """


    class Car(object):
    """一次模拟汽车的简单尝试."""

    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

    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("This car has a " + str(self.battery_size) + "-kWh battery.")


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

    def __init__(self, make, model, year):
    """电动汽车的独特之处.

    初始化父类的属性,再初始化电动汽车特有的属性(电瓶容量)
    """
    super().__init__(make, model, year)
    self.battery_size = Battery()


    my_tesla = ElectricCar('tesla', 'model s', 2016)
    print(my_tesla.get_descriptive_name())
    my_tesla.battery_size.describe_battery()
  5. 需要同时导入标准库中的模块和你编写的模块时,先编写导入标准模块的 import 语句,再添加一个空行,然后编写导入你自己编写的模块的 import 语句