类
类的创建
class Dog():
def __init__(self,name,age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + ' is sitting' )
def roll_over(self):
print(self.name.title() + 'rolled over')
def jump(self,height):
self.height = height
print(self.name.title() + 'could jump ' + self.height + ' meters')
D = Dog('wangwang',2) # 实例化
概念
- 类是指现实生活中各种对象的抽象化,比如我们常说的狗,也就是狗这一大类,狗类拥有共同的特征,比如它们有姓名,年龄,性别,以及坐滚爬跳各有各的不同点,我们可以将这些概括为属性与行为,属性对应前面的姓名,年龄,性别等,对应上文代码__init__下的内容,行为对应坐滚爬跳等,行为也称为方法,对应上文代码中定义的sit和roll_over函数。
- 类的创建使用关键词class,类名使用大写字母开头,后面跟一个括号以及冒号。
- 第一点提到的姓名,性别,年龄,坐滚爬跳等都是抽象的概念,并没有指定具体的内容是什么,只是指出有这一项,具体内容是什么还需要后面进一步实例化
- 实例是指基于类创建的实际对象,比如基于狗类我们创建一个狗叫做旺旺,旺旺拥有类中的所有属性以及行为,它拥有姓名,年龄,性别以及自己独特的坐滚爬跳的一套行为,具体什么样应该在实例中表现出来。
说明
- 代码中__init__是一种特殊的方法,每当创建一个新的实例时都会自动调用它,注意首位双下划线,这是系统内置方法的特征,区别于普通的方法。在__init__中都会有一个形参self,后面的形参可以自行根据需要添加,但是self必不可少,当对一个类进行实例化时,会自动传递self,self是指向本身的意思,也就是自报家门,表明要对这个类进行实例化,这个类所有的属性以及方法都得围着我转,我说什么你们就得以我为中心进行操作。
- self不需要再实例化的实参表中明确指出,一旦实例化后,系统就会自动产生一个self实参传递给类,如代码D = Dog(‘wangwang’,2)没有写出self实参,只写出新定义的两个实参。
- 在后面两个函数定义中我们都看到了括号后面的形参都为self,对应第一点所说的一切都要以实例为中心,而且必不可少,还看到self.name的形式,以及对他的赋值,对于可赋值的变量称为属性,属性并不都一定时__init__下才有,方法中的参数也可以有,比如代码中的jump方法。
实例的创建
class Dog():
def __init__(self,name,age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + ' is sitting' )
def roll_over(self):
print(self.name.title() + 'rolled over')
my_dog = Dog('wangwang',2) # 创建实例
his_dog = Dog('wangcai',1)
my_dog.name # 访问属性
his_dog.name
my_dog.sit() # 调用方法
his_dog.roll_over()
- 一般使用大写字母开头作为类的命名,小写字母开头作为实例的命名
- 建立实例形式,这一步时实例化的开始,也是必不可少的一步,实例可以同时创建多个,如上表示,首先需要传入实参,也就是对属性进行设置,如姓名以及年龄,当__init__内只有self时,实例化时虽然不需要填实参,但是括号必须带上
- 实例化之后对属性的访问形式为实例名.属性,对方法的调用形式为实例名.函数(参数)
课后习题
9-1餐馆
class Restaurant():
def __init__(self,restaurant_name,cuisine_type):
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
def describe_restaurant(self):
print('This restaurant\'s name is ' + self.restaurant_name.title())
print('It\'s cuisine type is ' + self.cuisine_type)
def open_restaurant(self):
print('Opening')
restaurant = Restaurant('tong fu restaurant','chuancai')
restaurant.restaurant_name
restaurant.cuisine_type # 访问属性
restaurant.describe_restaurant()
restaurant.open_restaurant() # 调用函数
9-2三家餐馆
class Restaurant():
def __init__(self,restaurant_name,cuisine_type):
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
def describe_restaurant(self):
print('This restaurant\'s name is ' + self.restaurant_name.title())
print('It\'s cuisine type is ' + self.cuisine_type)
def open_restaurant(self):
print('Opening')
restaurant_1 = Restaurant('tong fu restaurant','chuancai')
restaurant_1.describe_restaurant()
restaurant_2 = Restaurant('sah xian snack','mincai')
restaurant_2.describe_restaurant()
restaurant_3 = Restaurant('lan zhou noddles','qingzhen')
restaurant_3.describe_restaurant()
9-3用户
class User():
def __init__(self,first_name,last_name):
self.first_name = first_name
self.last_name = last_name
def describe_users(self):
print('first name is:' + self.first_name)
print('last name is:' + self.last_name)
def greet_user(self):
print('Hello ' + self.first_name + ' ' + self.last_name + ',time for returning money!')
user_1 = User('kobe','brayant')
user_1.describe_users()
user_1.greet_user()
对类和实例的处理
设定属性默认值
需要进行默认值设定的属性可直接在__init__下进行赋值修改可以不直接写在括号内的参数中
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.miles = 0 # 设定属性默认值
def get_descriptive_name(self):
long_name = self.make + ' ' + self.model + ' ' + str(self.year)
return long_name
my_car = Car('honda','accord',2010)
print(my_car.get_descriptive_name())
print(my_car(miles))
修改属性值
直接对属性值进行修改
class Dog():
def __init__(self,name,age):
self.name = name
self.age = age
my_dog = Dog('wangwang',2)
my_dog.name = 'wangcai'
print(my_dog.name) # 'wangcai'
通过方法进行修改
class Dog():
def __init__(self,name,age):
self.name = name
self.age = age
def jump(self,height):
self.height = height
print(self.name.title() + 'could jump ' + self.height + ' meters')
my_dog = Dod('wangwang',2)
my_dog.jump(12)