创建 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.")
- __init__() : 有点类似于Java的构造函数,实例化的时候会自动执行该方法。
- self: 类似于Java的this,不能省略该参数。
- self.odometer_reading = 0:这是一个默认值,不需要改变该值的时候,实例化时不需要设置。
- 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),每个模块同样需要。
空行:在一个类中,方法之间使用一个空行;在一个模块中,不同类之间使用两个空行。
引入:先引入标准模块,后引入自定义模块,而且之间用一个空行隔开。