2019-01-06 Classes

创建 Creating

class Car():
    """A simple attempt to represent a car."""

    def __init__(self, make, model, year):
        """Initialize attributes to describe a car."""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
        self.battery = Battery()

    def get_descriptive_name(self):
        """Return a neatly formatted descriptive name."""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name

    def read_odometer(self):
        """Print a statement showing the car's mileage."""
        print("This car has " + str(self.odometer_reading) + " miles on it.")
  1. __init__() : 有点类似于Java的构造函数,实例化的时候会自动执行该方法。
  2. self: 类似于Java的this,不能省略该参数。
  3. self.odometer_reading = 0:这是一个默认值,不需要改变该值的时候,实例化时不需要设置。
  4. self.battery = Battery(): 以实例作为一个属性。

实例化 Instantiation

实例化一个对象

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

这时候可以发现,实例化的时候,调用的时候,参数self是不需要传值的。

修改属性的值

  • 直接修改
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
  • 通过类的方法修改
class Car():
    --snip--
    def update_odometer(self, mileage):
        """
        Set the odometer reading to the given value.
                Reject the change if it attempts to roll the odometer back.
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

--snip--
my_new_car.update_odometer(23)
my_new_car.read_odometer()

继承 Inheritance

class Car():
    --snip--


class ElectricCar(Car):
    """Represent aspects of a car, specific to electric vehicles."""

    def __init__(self, make, model, year):
        """
        Initialize attributes of the parent class.
                Then initialize attributes specific to an electric car.
        """
        super().__init__(make, model, year)
        # version 2.7
        # super(ElectricCar, self).__init__(make, model, year)


my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
  • 父类 Parent Class: Car
  • 子类 Child Class: ElectricCar,声明的时候注意传入父类ElectricCar(Car)
  • super(): 调用父类中的方法

重写 Overriding

方法名称、参数保持一致

导入类 Importing Classes

上面例子我们把所有的类、实例化都写在一个文件里面,我们的文件可能很长,不利于阅读。
我们把类抽出来,写在另一个文件(模块Module)中。实例化的时候用import引入。

语法:

import moduleName
from moduleName import className1, className2,...
from moduleName import *

例子:

car.py

class Car():
    --snip--


class ElectricCar(Car):
    --snip--

my_cars.py

  • import moduleName
import car

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

my_tesla = car.ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
  • from moduleName import className1, className2,...
from car import Car, ElectricCar

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

my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
  • from moduleName import *
from car import *

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

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

标准库 Standard Library

Python自带一系列的模块(标准库),我们可以直接使用它们。如collections模块。

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

语法规范

类名:驼背式(CamelCaps),不用下划线
模块名:全部小写,单词之间用下划线
说明:定义一个类时,在开头要用文本说明(docstring),每个模块同样需要。
空行:在一个类中,方法之间使用一个空行;在一个模块中,不同类之间使用两个空行。
引入:先引入标准模块,后引入自定义模块,而且之间用一个空行隔开。

你可能感兴趣的:(2019-01-06 Classes)