0.什么是类
类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。类是一种用户定义类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象。
面向对象编程是最有效的软件编写方法之一。在面向对象编程中,我们用类定义一类对象的通用行为,而用类创建的对象则都具有这种通用行为,然后可以根据需要赋予每个对象独立的特性。
在类中,我们把根据类创建对象这个过程称为实例化。
通俗地理解:每个人都有类似的特征,比如都有一个头、两只手和两条腿,我们都称为“人”,那么“人”就可以称作一个类,是一个虚指的概念。但我们知道我们虽然特征都是一样的,但每个人都是不同的,比如有不同的身高,体重,肤色等,这些特征是每个人特有的,不能一概而论。不同的人,都属于“人”这个类,但不同的特性表明了这不是同一个个体,所以每个人都是一个实例,是实实在在的存在。
1.创建类
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类中,第一个特殊的方法是__init__(),这个方法在创建新的实例时,Python都会自动运行它。
注意,init前后都有两道下划线,这是一种约定,只在避免Python默认方法与不同方法名称冲突。
在类的方法中,都有一个self参数,新手只需要记住,这个参数必不可少,还必须位于其他参数前面。在传参的时候,忽略self参数即可,python会帮助我们完成self参数的处理。
self实际上是一个指向实例本身的引用。在Python调用__init__()方法来创建实例的时候,将自动传入实参self。每个与类相关联的方法在调用时,都会自动传递实参self,让实例能够访问类的属性和方法。比如,本例中的类在实例化的时候,会自动调用_init__方法,通过实参向Dog类传递了name和age。由于self的自动传递功能,使得我们在创建Dog实例的时候,只需要提供两个形参(name,age),那么类中的所有方法都可以访问这两个参数。
2.实例化
前面一节,我们定义了一个Dog类,下面我们创建一个Dog的实例,展示类的使用方法。
my_dog = Dog('willie',6)
your_dog = Dog('lucy',3)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog's is " + str(my_dog.age) + "years old.")
my_dog.sit()
print("\nYour dog's name is " + your_dog.name.title() + ".")
print("Your dog's is " + str(your_dog.age) + "years old.")
your_dog.sit()
我们根据类的定义,创建了两个实例:
一个是my_dog:并传入参数,name='willie' , age=6
一个是your_dog:并传入参数,name='lucy' , age=3
通过调用类中定义的方法:sit(),不同的类的实例,会有不同的sit()输出。
这正是类的核心思想,属于同一个类的不同实例,拥有类似的形式,但却有着不同的内容。
3.添加带默认值的属性
一个类中,可能会用到很多属性,但这些属性不一定都需要通过形参传入。
class Room():
def __init__(self,seats):
self.seats = seats
self.customer = 0
def enter(self):
if self.customer <= self.seats:
print("Enter,please!")
self.customer += 1
else:
print("Sorry,no seat available!")
比如,这里我们定义了一个房间的类,实例化的时候,我们传入房间的座位数。但是,当有顾客进入的时候,我们需要房间内是否还有空座位。因此,在__init__方法中,我们定义了一个customer=0 的计数器,用于统计房间内人数。这个计数器初值通常来说都是0,所以我们并不需要把它作为参数传入,而是直接赋初值0即可。
当我们在类中需要使用一些变量的时候,也可以通过这样的方式创建。创建后的属性,类中的所有方法都可以访问到。
4.修改属性的值
修改属性的值有两种方式:
- 直接实例名.属性名的方式修改,比如my_dog.age = 7
- 利用类中的方法修改,比如在类中添加update的方法,在方法中修改属性值。
my_dog = Dog('willie',6)
print("My dog's is " + str(my_dog.age) + "years old.")
print("One year later")
my_dog.age = 7
print("My dog's is " + str(my_dog.age) + "years old.")
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')
def grow_up(self):
self.age = self.age + 1
my_dog = Dog('willie',6)
print("My dog's is " + str(my_dog.age) + "years old.")
print("One year later")
my_dog.grow_up()
print("My dog's is " + str(my_dog.age) + "years old.")