众所周知,python也是一门面向对象的语言。那么我们就绕不开一个话题——对象的类型。在学习变量时我们便知道,这个变量可能是string,int或是bool等类型,都是一些python中已经存在的类型。那么如何创建自己的类呢?
类的定义以关键字class开头,后面接类名。
通过冒号和缩进控制类的内容。
类的结构如下所示:
class 类名:
类的成员变量
类的成员方法
这里我们就以输出Hello world为例创建我们的第一个类。
class hello:
temp = 'world!'
def output(self):
print('Hello', self.temp)
to_hello = hello()
to_hello.output()
输出:
Hello world!
可以看到,我们创建了一个名为hello的类,并用它实例化了一个to_hello对象,通过调用类中的output方法,我们成功输出了Hello world!
首先,我们定义一个student类,用于存放学生姓名。先运行一下看看。
class student:
name = ''
def __init__(self, temp):
self.name = temp
def output(self):
print('My name is', self.name)
stu_1 = student('老王')
stu_1.output()
输出:
My name is 老王
类中定义的函数我们称之为方法。当我们在类中定义方法时括号内的第一个形参必须是self,self在这里的含义是指我们实例化的对象。self并不是python中的关键字,所以类中方法的第一个形参也可以是其他名字,但是行业惯例都将其命名为self,所以我们也就不要钻牛角尖了。
所谓构造函数,就是演示中的__init__函数。构造函数在我们调用类去创建对象时会自动调用,用来完成对对象的初始化。
类还有一个函数,叫析构函数。析构函数在对象被回收时会自动调用。构造函数和析构函数在类的定义时都可以不写。有关析构函数的知识大家可以自行csdn一下。
由此可见,在我们通过student类实例化stu_1对象时,我们将字符串’老王’传入对象的构造函数形参temp中,temp又传给了对象的成员变量name中。当我们调用stu_1对象的output方法时,print函数便将字符串’My name is’和成员变量name里存的字符串’老王’合在一起输出。于是结果就是“My name is 老王”。
当我们想要建立有从属关系的几个类时,没必要将类中的重复功能再写一遍,通过类的继承,可以减少我们的工作量。
示例:
class people:
name = ''
def __init__(self, name):
self.name = name
def output(self):
print('My name is', self.name)
class student(people):
age = 0
grade = 0
def __init__(self, name, age, grade):
people.__init__(self, name)
self.age = age
self.grade = grade
def output(self):
print('我的名字是{},年龄是{}岁,成绩是{}。'.format(self.name, self.age, self.grade))
stu_1 = student('老王', 20, 60)
stu_1.output()
输出:
我的名字是老王,年龄是20岁,成绩是60。
student类的定义中使用了括号,括号中写了people类,表明我们创建的student类是从people类中继承过来的。people类称为父类,student类称为子类。
在构造函数中也应当加载父类的构造函数用于初始化从父类那里继承来的name变量。
同时我们重写了output函数,如果不重写output函数,我们将使用的是people类里的效果。
如果我们创建了student的对象,想使用people里的output方法,可以通过super函数来实现,具体细节大家可以自行csdn。
我们通过对成员变量前加两个下划线来声明该成员变量为私有的。
示例如下:
class student:
name = ''
__grade = 0
def __init__(self, name, grade):
self.name = name
self.__grade = grade
def output(self):
print('名字是{},成绩是{}。'.format(self.name, self.__grade))
stu_1 = student('老王', 60)
stu_1.output()
print(stu_1.name)
print(stu_1.__grade)
输出:
名字是老王,成绩是60。
老王
AttributeError: 'student' object has no attribute '__grade'
这里可以看到student类里的output函数调用了__grade变量,可以正常输出。但是我们直接将它打印出来却显示没有此变量。由此我们可以知道——私有化的成员只能在类的内部调用 ,不能在类的外部调用。