58 lines
4.0 KiB
Markdown
58 lines
4.0 KiB
Markdown
# python3小白课:定义类和实例化对象
|
||
|
||
搞懂面向对象之后,我们来开始讲python中的类如何定义,首先我们需要先定义类,才能通过类来实例化对象。
|
||
|
||
在python中,定义类的语法如下:
|
||
|
||
```python
|
||
class 类名:
|
||
执行语句、类变量、类方法等
|
||
```
|
||
|
||
我们可以看到,定义一个类的关键字为`class`,类名的命令跟之前变量命名差不多,但一般约定俗成,类名是一个或多个有意义的单词连缀而成的,中间没有分隔符,每个单词的首字母大写,其他字母全部小写,比如`XiaoBai`。
|
||
|
||
类之内可以写一些执行语句、定义变量、定义方法(需要注意该缩进的地方缩进),定义方法使用的也是`def`关键字,跟平时定义一个函数差不多,但形参定义时有一点小小的不同,这个后面会讲解。
|
||
|
||
如果类中没有任何内容,或者暂时不添加代码内容,你可以使用`pass`关键字来先占位。
|
||
|
||
我们来看一个小例子来讲解细节:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
class Student:
|
||
"""这个地方可以定义类的帮助文档"""
|
||
# 定义类变量
|
||
sex = "男男男"
|
||
# 定义构造函数
|
||
def __init__(self, name, age=18, sex="男"):
|
||
# 实例的变量,区别于类变量
|
||
self.name = name
|
||
self.age = age
|
||
self.sex = sex
|
||
# 定义一个其他方法
|
||
def info(self):
|
||
print(Student.sex)
|
||
print("姓名:{},年龄:{},性别:{}".format(self.name, self.age, self.sex))
|
||
# 查看帮助文档
|
||
help(Student)
|
||
# 实例化对象
|
||
s = Student("小白", 19)
|
||
s.info()
|
||
print(s.name, s.age, s.sex)
|
||
# 可以赋值
|
||
s.name = "小黑"
|
||
s.info()
|
||
# 调用类变量需要加上类名
|
||
print(Student.sex)
|
||
```
|
||
|
||
* 首先我们使用了class关键字定义了一个`Student`类,里面可以定义类帮助文档、类变量和方法,我们可以发现,定义的类变量在调用的时候需要加上类名。
|
||
* 类中一般会定义一个`__init__`的构造函数,它也是python系统中内置的特殊方法。这个函数在实例化对象的时候会自动调用,通常一个类会包含这个函数,并且会在这个函数中初始化一些实例变量。首先我们可以注意到每一个方法的第一个形参都是`self`,即使在没有参数应传入的方法中也是如此,这是类的方法跟普通函数的定义的不同之处。为什么要这样呢?类的方法一般会通过实例化后的对象进行调用,`self`表示调用它的对象本身,调用方法时对象会自动绑定到第一个形参中去,调用时从第二个形参开始传递参数即可。这是约定俗成的,你记住就行,更深入的探究可以结合后面的课程或者查阅资料来理解。
|
||
|
||
> [!tip]
|
||
>
|
||
> 实际也不一定要用`self`可以用别的,在类中统一即可,但约定俗称用`self`,这样具有最好的可读性,在某些IDE中也能自动进行处理。
|
||
|
||
* 我们需要注意,实例变量跟类变量是不同的。所以`self.sex`和`sex`是不同的,类变量一般在方法之外定义,一般来讲不同的实例会共用一份,可在外部赋值修改,使用类名来调用它,如`Student.sex`,直接用`sex`不行。而实例变量的话是像`self.sex`这样的,一般在构造函数中创建。我们可以创建多个实例,每个实例都可以设定自己的`sex`值。调用时使用`实例名.sex`调用,比如我们的实例名为`s`,那就是`s.sex`即可。如果有需要,我们也可以在外部代码添加实例变量,比如在外部代码中增加一句`s.nickname = "小白白"`,这样这个实例就多了一个新的实例变量了。
|
||
* 在实例化对象的时候,我们可以自行设定一个实例名(变量),初始化之后,就可以使用该实例名来调用该实例下的实例变量和方法了。比如这里我们使用`s`作为实例名。创建实例之后,我们可以给取现有的实例变量的值,也可以赋值。甚至还可以定义新的实例变量,但使用范围仅限于该实例。
|