系列文章目录
一、类的定义与实例化对象
python之中,一切皆对象!
-
定义类:
使用def关键字定义方法,使用class关键字定义类,类名使用大驼峰命名法。
下面是一个学生类的例子:
class Student(object): classroom = '111' address = '成都' def __init__(self, name, age): self.name = name self.age = age def print_age(self): print('%s: %s' % (self.name, self.age)) print('类的定义完成') # 会在类的定义阶段执行
涉及的语法比较多,先有个印象,后面会详细讲到:
- classroom、address写在类中,是类属性。
- name、age写在
__init__
方法中,属于实例属性。 __init__
方法又叫初始化方法,在实例化对象的时候,会自动执行。- self代表实例化后的对象本身,它不是关键字,而是约定俗成的写法。
print_age
是一个实例方法。- Student类没有父类,默认继承object类,它是Python3中所有类的父类。
-
实例化对象的格式:
实例化对象就是调用类产生一个对象,按照初始化方法的需要,传入参数:
zhang = Student("张三", 23) # 实例化一个对象,保存在变量zhang中 li = Student('李四', 24) # 实例化一个对象,保存在变量li中
二、实例属性和类属性
-
实例属性:
-
含义:
实例属性指的是实例对象本身拥有的属性,定义在初始化方法中,不同的实例对象所拥有的实例属性的值都不同。
比如:上述学生类例子中,zhang和li是两个不同的对象,所以他们的实例属性name、age的值都不相同。
-
访问方法:
一定要先实例化,再通过实例对象来访问:
zhang.name # 返回:张三 li.name # 返回:李四
-
-
类属性:
-
含义:
类属性是所有实例对象共有的属性,不受具体对象的影响;定义在类内部、方法外部。
比如:上述学生例子中,classroom和address就是类属性。
-
访问方法:
不一定要实例化,可以直接用类来访问,也可以用实例对象来访问:
Student.classroom # 返回:111 Student.address # 返回:成都 li.classroom # 返回:111 zhang.address # 返回:成都
注意:为了避免混淆,类属性的访问和修改,应该通过类来完成!
-
-
属性的查找顺序:
访问属性时,解释器会先在实例属性列表中查找,找不到就去类属性列表中找。
-
添加和修改属性:
只需要使用赋值语句,属性已存在就修改值,不存在就创建属性。
li.age = 20 # age已存在,由24修改为20 li.gender = 'male' # gender不存在,创建gender属性
三、类的方法
类的方法包括实例方法、静态方法、类方法三种,它们都定义在类中:
-
实例方法:
实例方法由实例调用,至少包含一个self参数,且为第一个参数。self代表实例对象本身,在执行实例方法时,会自动将调用该方法的实例赋值给self。
比如:学生类中的
print_age
就是实例方法。调用:实例名.实例方法
-
静态方法:
静态方法由类调用,无默认参数。在方法的定义上方加上
@staticmethod
,就构成了实例方法。调用:类名.静态方法(建议)或者实例名.静态方法
class Foo(object): @staticmethod def static_method(): pass Foo.static_method()
-
类方法:
类方法由类调用,采用
@classmethod
装饰,至少传入一个cls(代指类本身,类似self)参数。执行类方法时,自动将调用该方法的类赋值给cls。调用:类名.类方法(建议)或者实例名.静态方法
class Foo(object): @classmethod def class_method(cls): pass Foo.class_method()