语法:
class 类名:
类体
1、关键字class 表明定义的是类,与函数定义不同,类名的后面是不带小括号的;
2、类名必须符合“标识符”的规则;一般规定,首字母大写,多个单词使用“驼峰原则”;
3、与C++类似,在类体中,可以定义属性和方法;属性用来描述状态(数据),方法则描述操作。
- class Student:
- def __init__(self,name,score): #构造方法第一个参数必须为self
- self.name = name #实例属性
- self.score = score
-
- def say_score(self): #实例方法
- print(self.name,'的分数是:',self.score)
-
-
- s1 = Student('张三',80) #s1是实例对象,自动调用__init__()方法
- s1.say_score()
__init__() 就是类的构造函数 :
1、左右两个下划线,名称必须是__init__ 表明是该类的构造函数
2、python不支持函数重载,那么与C++不同,构造函数只能有一个;
3、构造函数自动调用,第一个参数固定,必须为:self ,self其实就是C++中的this指针;C++中this指针经常隐藏,尤其是普通的成员函数则默认在编译的时候完成,Python 中的普通成员函数都会带上一个self ;
4、如果不定义__init__方法,系统会提供一个默认的__init__方法。如果定义了带参的__init__方法,系统不创建默认的__init__方法;
5、self并不是Python的关键字,你完全可以用其他单词取代他,只是按照惯例和标准的规定,推荐使用self。
类是模板,实例则是根据模板创建出来的一个个 “实体”。类所关注的是提取“共性”,实例则各有各的“个性”。
实例属性是从属于实例对象的属性,也称为“实例变量”。要点:
1、实例属性一般在__init__()方法中通过如下代码定义:
self.实例属性名 = 初始值
2、在本类的其他实例方法中也可以定义实例属性,事实上因为__init__()方法在生成实例的时候会自动调用,所以通过它定义的属性在其他地方可以使用;
3、创建实例对象后,还可以新加属性:
obj01 = 类名() #创建对象,调用__init__()初始化属性
obj01.实例属性名 = 值 #可以给已有属性赋值,也可以新加属性
实例方法是从属于实例对象的方法。实例方法的定义格式如下:
def 方法名(self [, 形参列表]):
函数体
方法的调用格式如下:
对象.方法名([实参列表])
要点:
1、定义实例方法时,第一个参数必须为self;
2、调用实例方法时,self 会自动绑定为调用该方法的对象(this指针);
定义一个类,在Python中就是生成了一个 “ 类对象 ”。如:
- class Person:
- pass
- print(type(Person))
- print(id(Person))
- T = Person
- x=T()
- print(id(x))
Person这个类对象 在没有生成实例的时候就 已经存在,这点很重要,关系到类属性、类方法。
类属性是从属于“类对象”的属性,也称为“类变量”。由于,类属性从属于类对象,可以被所有实例对象共享。语法:
class 类名:
类变量名= 初始值
在类中或者类的外面,可以通过:“类名.类变量名”来读写,也可以通过实例来访问:
- class Person:
- name="tom"
- print(Person.name)
- x=Person()
- print(x.name)
值得注意的是,实例属性与类属性是可以同名的:
- class Person:
- Name="tom"
- def __init__(self):
- self.Name="jack"
- print(Person.Name) # tom
- x=Person()
- print(x.Name) # jack
当然,应该尽量避免以上定义变量的问题。核心点:类属性可以被实例使用,实例属性当然不能被类调用。
类方法是从属于“类对象”的方法。类方法通过装饰器@classmethod来定义,语法 :
@classmethod
def 类方法名(cls [,形参列表]) :
函数体
classmethod必须位于方法上面,第一个参数为cls 必须有,cls指的就是“类对象”本身(类似self);调用类方法格式:“类名.类方法名(参数)”。 类方法不能访问实例属性和实例方法(没有self )。
- class Person:
- Name="tom"
- @classmethod
- def fun(c,rename): # 不一定必须为cls
- c.Name=rename # 只能访问类变量
- #Person.Name=rename # 也可以这样写
- Person.fun("jack")
- print(Person.Name)
静态方法与类方法有很多类似的地方,区别在于类方法会自动带上cls (类对象),而静态方法没有。静态方法与函数(全局方法)不同之处在于静态方法需要通过类来调用。
- class Person:
- Name="tom"
- @staticmethod
- def fun(rename): #没有cls
- Person.Name=rename #使用类变量的是时候,只能通过类名来使用
- Person.fun("jack")
- print(Person.Name)