Python中的类
class Person():
"""
文
档
内
容
"""
def __init__(self,name):
self.name = name
def speak(self):
"""打个招呼,介绍下自己"""
print("Hello,我是" + self.name)
person1 = Person("张三")
person1.speak()
print(Person.__doc__)
print(help(Person.speak))
上面代码是一个简单的python类,下面来说明一下:
- 第一行定义了一个名字叫Person的类.其中class是关键字,小括号里是要继承的类.
- 第二行开始的是类的说明文档,用三引号引起来,可以支持多行.
- 接着__init__可以理解为类的构造函数,在类实例化时都会自动调用,里面的self是必须的,可以理解为其他语言中的this.顺便说一下像这类以 __ 开头结尾的函数都是Python中的魔法函数,所有魔法函数都会自动调用,并有自己的调用时机.
- 再往下的def speak(self)就是类的成员函数,所有的成员函数都有一个self参数.下面一行由三引号括起来的是这个函数的简介.到此为止一个简单的python类就已经写完了.
- 接着这一行person1 = Person(“张三”)是定义了一个名字为person1的Person类实例.
- person1.speak()是调用类中的成员函数,调用时会将person1作为成员函数speak的self参数传入
- print(Person.doc)的结果是打印Person类的说明文档,想要看的话可以自己运行上面的代码,你可以使用 类名.doc 的方式来查看所有类的说明文档.
8.print(help(Person.speak))的显示结果是打印成员函数speak的函数说明
经过上面的例子,你应该能:
- 知道如何定义一个python类
- 知道如何写一个类的说明文档
- 知道如何定义类的构造函数
- 知道如何定义一个类的成员函数
- 知道如何写函数说明
- 知道如何实例化一个类,并调用其成员函数
- 知道怎么查看类的说明文档和函数的函数说明
类和对象的成员分析
类里面包含的东西可以笼统的分为两种,变量和函数.我们定义的类就好像一张设计图纸,而生成的实例就像是按照图纸制作出来的东西.在我学的所有支持OOP的程序语言中,都有一下几个共同点:
- 无论按照类所生成的实例有多少个,内存中的成员函数代码都只有一份
- 所有的实例都有一份自己独有的存储空间用于存储自己的变量.
- 实例调用成员函数时,都是将自己的存储空间地址传给成员函数,以实现功能的调用.这就是C++,C#,java里this的由来.别看这些语言中调用时没有显示的传入this,但看汇编代码能看出来其实都是传了this的,而且都是第一个传的.这也是为什么Python里为什么每个成员函数都要有self这个参数的原因.如果没有self,而函数代码又只有一份,那么如何区分这个实例和那个实例呢?
在Python里还有一个特点,就是类在定义完毕以后也有一份自己的存储空间,如果类里面有默认变量赋值,那么实例中如果没有修改该变量的话会直接引用类中的变量,而不是在自己的存储空间中复制一份.
如何证明我说的是正确的呢?请看下面的代码:
class Person():
name = "张三"
age = 18
print(Person.__dict__) #__dict__可以显示该类或实例下的所有东西
person1 = Person()
print(person1.__dict__)
print(person1.name)
结果如下:
{‘module’: ‘main’, ‘name’: ‘张三’, ‘age’: 18, ‘dict’: <attribute ‘dict’ of ‘Person’ objects>, ‘weakref’: <attribute ‘weakref’ of ‘Person’ objects>, ‘doc’: None}
{}
张三
可以看到Person类里面有一堆东西,而实例里面什么都没有,却能用person1.name打印出名字,说明这个name用的是类里面的name.这段代码就能证明我上面观点的正确.