本文使用的书籍是《Python编程:从入门到实践》
本文使用的是Python3.6
一、创建和使用类
- 创建Dog类
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + “ is now sitting.”)
def roll_over(self):
print(self.name.title() + “ rolled over!”
这是一个类的基本结构,接下来我们会一步一步学习它。
首先,在这个Dog类的创建中,class的括号里是没有东西的,因为我们要从空白创建这个类。
(1)方法__init__()
类中的函数称为方法:你前面学到的有关函数的一切都适用于方法,就目前而言,唯一重要的差别就是调用方法的方式。
init()方法是一个特殊的方法,在你使用Dog类创建新实例时,Python会自动运行它。
创建新实例的意思大概是,我们上面的例子就只是一个模板,当你要使用这个模板的东西时,要对它进行实例化。
PS:init()的方法名是固定的,不能修改。
我们将方法__init__()定义成包含三个形参:self,name和age。在这个方法的定义中,形参self必不可少,还必须位于其他形参前面。
具体原因看书中介绍。
其它两个形参,是我们定义时需要的,当然你也可以不要,也可以加入其他的形参。
(2)在Python2.7中创建类
class Dog(Object):
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + “ is now sitting.”)
def roll_over(self):
print(self.name.title() + “ rolled over!”
多了个Object
- 根据类创建实例
接下来学习如何创建实例。
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + “ is now sitting.”)
def roll_over(self):
print(self.name.title() + “ rolled over!”
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.")
这里我们用Dog类这个模板创建了一个实例my_dog。
创建实例的时候,要根据Dog类的__init__中的形参对其进行赋值。
(1)访问属性
要访问实例的属性,可使用句点表示法。
例如my_dog.name
(2)调用方法
根据Dog类创建实例后,也可以使用句点表示法来调用Dog类下的方法。
例如my_dog.sit()
(3)创建多个实例
可按需求根据类创建任意数量的实例。
例如
my_dog = Dog(‘willie’, 6)
your_dog = Dog(‘lucy’, 3)
动手试一试:
# 9-1
class Restaurant():
def __init__(self, restaurant_name, restaurant_type):
self.restaurant_name = restaurant_name
self.restaurant_type = restaurant_type
def describe_restaurant(self):
print("\n这家餐厅的名字是:" + self.restaurant_name + "\n这家餐厅的类型是" + self.restaurant_type)
def open_restaurant(self):
print("\n这家餐厅开始营业!")
my_restaurant = Restaurant('北京烤鸭', '烤鸭店')
print(my_restaurant.restaurant_name)
print(my_restaurant.restaurant_type)
my_restaurant.describe_restaurant()
my_restaurant.open_restaurant()
# 9-2
class Restaurant():
def __init__(self, restaurant_name, restaurant_type):
self.restaurant_name = restaurant_name
self.restaurant_type = restaurant_type
def describe_restaurant(self):
print("\n这家餐厅的名字是:" + self.restaurant_name + "\n这家餐厅的类型是" + self.restaurant_type)
def open_restaurant(self):
print("\n这家餐厅开始营业!")
my_restaurant = Restaurant('北京烤鸭', '烤鸭店')
your_restaurant = Restaurant('糖醋排骨', '排骨店')
his_restaurant = Restaurant('宫保鸡丁', '鸡肉店')
my_restaurant.describe_restaurant()
your_restaurant.describe_restaurant()
his_restaurant.describe_restaurant()
# 9-3
class User():
def __init__(self, first_name, last_name, **kd):
self.first_name = first_name
self.last_name = last_name
self.preperties = {}
for key, value in kd.items():
self.preperties[key] = value
def describe_user(self):
print('\nfirst name: ' + self.first_name + '\nlast name: ' + self.last_name)
for key, value in self.preperties.items():
print(key + ': ' + value + '\n')
i = User('233', '233', hobby='sleep')
you = User('666', '666', favorite='study')
i.describe_user()
you.describe_user()
二、使用类和实例
下面来讲述如何使用类和实例:
- Car类
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
return long_name.title()
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
- 给属性指定默认值
class Car():
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.yesr) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odomter(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_odomter()
这是书中的方法,但是我觉得还是这样比较好。
class Car():
def __init__(self, make, model, year,odometer_reading=0):
self.make = make
self.model = model
self.year = year
self.odometer_reading = odometer_reading
def get_descriptive_name(self):
long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odomter(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_odomter()
- 修改属性的值
(1)直接修改属性的值
class Car():
def __init__(self, make, model, year,odometer_reading=0):
self.make = make
self.model = model
self.year = year
self.odometer_reading = odometer_reading
def get_descriptive_name(self):
long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odomter(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.odometer_reading = 23
my_new_car.read_odomter()
(2)通过方法修改属性的值
class Car():
def __init__(self, make, model, year,odometer_reading=0):
self.make = make
self.model = model
self.year = year
self.odometer_reading = odometer_reading
def get_descriptive_name(self):
long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odomter(self):
print("This car has " + str(self.odometer_reading) + " miles on it.")
def updata_odometer(self, mileage):
self.odometer_reading = mileage
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
# ...
my_new_car.updata_odometer(233)
my_new_car.read_odomter()
(3)通过方法对属性的值进行递增
class Car():
def __init__(self, make, model, year,odometer_reading=0):
self.make = make
self.model = model
self.year = year
self.odometer_reading = odometer_reading
def get_descriptive_name(self):
long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odomter(self):
print("This car has " + str(self.odometer_reading) + " miles on it.")
def updata_odometer(self, mileage):
self.odometer_reading = mileage
def increment_odometer(self, miles):
self.odometer_reading += miles
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
# ...
my_new_car.updata_odometer(233)
my_new_car.read_odomter()
# ...
my_new_car.increment_odometer(100)
my_new_car.read_odomter()
动手试一试:
# 9-4
class Restaurant():
def __init__(self, restaurant_name, restaurant_type):
self.restaurant_name = restaurant_name
self.restaurant_type = restaurant_type
self.number_served = 0
def describe_restaurant(self):
print("\n这家餐厅的名字是:" + self.restaurant_name + "\n这家餐厅的类型是" + self.restaurant_type)
def open_restaurant(self):
print("\n这家餐厅开始营业!")
def read_number(self):
print("\n在这家餐厅就餐的人数:" + str(self.number_served))
def set_number_served(self, number):
self.number_served = number
def increment_number_served(self, number):
self.number_served += number
my_restaurant = Restaurant('北京烤鸭', '烤鸭店')
my_restaurant.read_number()
my_restaurant.number_served = 1
my_restaurant.read_number()
my_restaurant.set_number_served(2)
my_restaurant.read_number()
my_restaurant.increment_number_served(1)
my_restaurant.read_number()
# 9-5
class User():
def __init__(self, first_name, last_name, **kd):
self.first_name = first_name
self.last_name = last_name
self.login_attempts = 0
self.preperties = {}
for key, value in kd.items():
self.preperties[key] = value
def describe_user(self):
print('\nfirst name: ' + self.first_name + '\nlast name: ' + self.last_name)
for key, value in self.preperties.items():
print(key + ': ' + value + '\n')
def increment_login_attempts(self):
self.login_attempts += 1
def reset_login_attempts(self):
self.login_attempts = 0
i = User('233', '233', hobby='sleep')
print(i.login_attempts)
i.increment_login_attempts()
print(i.login_attempts)
i.reset_login_attempts()
print(i.login_attempts)
三、继承
编写类时,并非总是要从空白开始。如果你要编写的类时另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法:原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
- 子类的方法__init__()
class Car():
def __init__(self, make, model, year,odometer_reading=0):
self.make = make
self.model = model
self.year = year
self.odometer_reading = odometer_reading
def get_descriptive_name(self):
long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odomter(self):
print("This car has " + str(self.odometer_reading) + " miles on it.")
def updata_odometer(self, mileage):
self.odometer_reading = mileage
def increment_odometer(self, miles):
self.odometer_reading += miles
class ElectricCar(Car):
def __init__(self, make, model, year):
# ...
super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
子类在定义__init__()方法时,要使用super()函数指定父类的创建实例所需的信息。
- Python 2.7中的继承
class Car():
def __init__(self, make, model, year,odometer_reading=0):
self.make = make
self.model = model
self.year = year
self.odometer_reading = odometer_reading
def get_descriptive_name(self):
long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odomter(self):
print("This car has " + str(self.odometer_reading) + " miles on it.")
def updata_odometer(self, mileage):
self.odometer_reading = mileage
def increment_odometer(self, miles):
self.odometer_reading += miles
class ElectricCar(Car):
def __init__(self, make, model, year):
# ...
super(ElectricCar, self).__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())