定义类:
class Student(): # 居然有括号
name = ‘’ # 定义变量
age = 0
def print_file(self): # 定义函数,”self”是必须的
print(‘name:’ + self.name) # 引用变量也要加self
# print_file()
使用类的方法(实例化):
student = Student()
student.print_file() # 调用类下面的方法
类只负责描述,不负责执行。这种思想也间接地解释了为什么类里不能使用函数(像第一个示例最后一行那样)。
类和对象(一个形象的比喻:类是模板,对象是印刷机):
class Student():
name = ‘’ # 类变量
age = 0 # 抽象的一类事物“Student”带有个体的属性name和age,所以在这里,类变量中定义age和name是不合适的
sum = 0 # 这样的属性定义给一类事物“Student”比较合适
# 使用构造函数生产不同的对象,这是构造函数的意义
def __init__(self, name, age): # 增加额外参数后,那么这几个参数在实例化时必须传入
# name = name 这样子print(student1.name)会打印’’,为什么?见后文。
self.name = name # 这样做是为了改变类下的name和age的初始值(最初的值’’和0),也就是定义实例变量
self.age = age # 将传入的参数保存为不同对象的特征值,也就是实例变量
self.__class__.sum += 1 # 调用类变量
print(age) # (1)
print(name)
print(‘student’)
def do_homework(self):
print(‘homework’)
# 尝试生产不同的对象
student1 = Student()
student2 = Student()
student3 = Student()
这几个对象一样吗?可以这样说。但在计算机里是不一样的,可以通过id()测试。
# 测试构造函数
student = Student()
student.__init__() # 可以这样调用构造函数,但通常不会这样做
# 上面两行将会打印两个’student’,因为__init__在实例化时自动调用
student.__init__()返回什么? 返回None。可以强制return其他吗?不行,会报错。
# 测试添加参数的构造函数
student1 = Student(‘石敢当’, 18)
print(student1)
# 测试实例变量和类变量
student1 = Student(‘石敢当’, 18)
student2 = Student(‘喜小乐’, 21)
print(student1.name)
print(student2.name)
print(Student.name)
# 理解为什么__init__构造函数里name = name时打印’’
print(student1.name)
print(student1.__dict__) # 我们用__dict__函数来一探究竟:字典保存着当前对象下面所有变量,这里打印的是空字典
# 那既然是空字符串那么为什么不直接打印None而是空字符串?因为这是Python内部变量查找机制,它取类里找到了同名变量’name’
# 实例方法参数self指代的就是调用该方法的实例,类方法同理
两个思考题;
上述代码中的(1)里将Print什么内容?
- 打印内容和self.name是一样的。
- 但name是读取的我们的形参’name’,也就是我们传入的参数的值。当你把形参改变,可以看到它会报错。
实例方法如何访问和使用类变量?
- 实例变量内部可以Student.name,通过类来调用。或者self.__class__.name
# 类方法
@classmethod
def plus_sum(cls): # 操作类相关的变量。这里举例操作sum属性。
cls.num += 1
print(cls.sum)
Student.plus_sum()
# 静态方法可以通过实例和类都可以调用
# 类方法和静态方法里可以调用实例变量self.name吗?不可以,self is not defined.