[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. 通過方法修改屬性的值

3. 通過方法對屬性的值進行遞增
