[TOC]
*****
# 9.1 创建和使用类
## 9.1.1 创建 Dog 类
根据Dog类创建的每个实例都将存储名字和年龄
```
class Dog():
"""A simple attempt to model a dog."""
def __init__(self, name, age):
"""Initialize name and age attributes."""
self.name = name
self.age = age
def sit(self):
"""Simulate a dog sitting in response to a command."""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""Simulate rolling over in response to a command."""
print(self.name.title() + " rolled over!")
```
类的首字母大写
**1. 方法_init_()** 创造实例的方法
_init_()是一个特殊的方法,每当你根据Dog类创建新实
例时, Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。
将方法_init_()定义成了包含三个形参: self、 name和age。在这个方法的定义中,形
参self必不可少,还必须位于其他形参的前面。
因为 Python调用这个_init_()方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法
## 9.1.2 根据类创建实例
```
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
```
Python使用实参'willie'和6调用Dog类中的方法_init_()。 方法_init_()创建一个表示特定小狗的示例
**1. 访问属性**
访问实例的属性,可使用句点表示法。
my_dog.name
**2. 调用方法**
根据Dog类创建实例后,就可以使用句点表示法来调用Dog类中定义的任何方法
```
my_dog.sit()
my_dog.roll_over()
```
**3. 创建多个实例**
```
my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 3)
```
# 9.2 使用类和实例
## 9.2.1 Car 类
编写一个表示汽车的类
```
class Car():
"""A simple attempt to represent a car."""
def __init__(self, manufacturer, model, year):
"""Initialize attributes to describe a car."""
self.manufacturer = manufacturer
self.model = model
self.year = year
def get_descriptive_name(self):
"""Return a neatly formatted descriptive name."""
long_name = str(self.year) + ' ' + self.manufacturer + ' ' + self.model
return long_name.title()
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
```
## 9.2.2 给属性指定默认值
类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。在有些情况下,如设置默认值时,在方法_init_()内指定这种初始值是可行的;如果你对某个属性这样做了,就无需包含 为它提供初始值的形参。
下面来添加一个名为odometer_reading的属性,其初始值总是为0
```
class Car():
"""A simple attempt to represent a car."""
#每个方法的第一个形参是self
def __init__(self, manufacturer, model, year):
"""Initialize attributes to describe a car."""
self.manufacturer = manufacturer
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
"""Return a neatly formatted descriptive name."""
long_name = str(self.year) + ' ' + self.manufacturer + ' ' + self.model
return long_name.title()
```
## 9.2.3 修改属性的值
1. 直接修改属性的值
```
my_new_car.odometer_reading = 23
```
2. 通过方法修改属性的值
![](https://img.kancloud.cn/ad/a4/ada4e00828beaceadc36f8269d858d02_414x210.png)
3. 通过方法对属性的值进行递增
![](https://img.kancloud.cn/ad/a4/ada4e00828beaceadc36f8269d858d02_414x210.png)