一、创建类的格式
class 类名([父类])
属性与方法定义
特别提示:
(1)父类缺省时为object。新创建的类称为父类的子类。子类拥有父类的公有属性和方法。
(2)子类可重写父类的方法。
(3)如果子类没有重写__init__方法,则子类实例化时自动调用父类的__init__方法。如果子类已重写__init__,则子类实例化时不调用父类的__init__方法。
(4)在子类中可通过“父类名.方法名()”调用父类的方法(需传递self参数)。
(5)可以同时继承多个父类创建子类。
二、定义类属性与对象属性
(1)类属性:在类的内部、类的所有方法的外部定义的变量,为类属性。
(2)对象属性:在类的方法内定义的变量,为对象属性。
示例(其中studentNum为类属性,name和age均为对象属性):
class Student( ):
studentNum=0
def __init__(self,name,age):
self.name=name
self.age=age
特别提示:
(1)对象属性只能由对象读写,类不能读写对象属性。类可以读写类属性,对象只能读类属性。对象属性与类属性同名时,对象将无法读取类属性。
(2)定义类后还可以通过类名创建类属性。如:Student.state="using"
(3)创建类的实例后,可以为实例创建对象属性。如:st1=Student("ZhangHui",22);st2=Student("LiuMin",20);st1.xh="B03"。这时st1有xh属性,但st2没有xh属性。
(4)以双下划线开头的属性为私有属性,只能在类内部访问,外部不能读写。除私有属性外,其他属性均为公有属性。
示例(其中__locked为类的私有属性,studentNum为类的公有属性;name、age为对象公有属性,__sid为对象私有属性):
class Student():
studentNum=0
__locked=0
def __init__(self,name,age):
self.name=name
self.age=age
self.__sid=0
三、创建类方法与对象方法
(1)在类的定义中,使用关键字@classmethod声明,且第一个参数为cls的方法是类方法。
(2)未使用关键字@classmethod声明,第一个参数为self的对象方法是对象方法。
示例(其中__init__、show均为对象方法,see为类方法):
class Student():
studentNum=0
def __init__(self,name,age):
self.name=name
self.age=age
Student.studentNum+=1
def show(self):
print(self.name,self.age)
@classmethod
def see(cls):
print(cls.studentNum)
特别提示:
(1)在对象方法中,可以通过“类名.类属性名”的方式读写类属性。在类方法中,通过“cls.类属性名”的方式读写类属性。
(2)类方法可由类和对象调用。对象方法只能由对象调用。
(3)类的定义中,以双下划线开头命名的方法为私有方法,否则为公有方法。公有方法可由外部调用,私有方法只能由类内部调用。
四、构造函数与析构函数
(1)构造函数是指命名为“__init__”的对象方法。
特别提示:
构造方法在创建类的实例时自动运行。可以为构造方法指定其他参数。如:
class Student():
def __init__(self,name,age):
self.name=name
self.age=age
这时,在实例化时可传递参数。如:st=Student("张三",18)
(2)析构方法是指命名为“__del__”的对象方法。
特别提示:
析构方法在类的实例被删除时自动运行。如:
class Student( ):
studentNum=0
def __init__(self,name,age):
self.name=name
self.age=age
Student.studentNum+=1 #创建类的实例时,类属性studentNum自动增加1
def __del__(self):
Student.studentNum-=1#删除类的实例时,类属性studentNum自动减少1
st1=Student("xiaoming",18)
st2=Student("zhaoji",19)
print(Student.studentNum)
del st2
print(Student.studentNum)
五、创建静态方法
以@staticmethod声明的方法为静态方法。
(1)静态方法不需要cls或self参数。如果一个方法不需要读写类实例的属性,则可以声明为静态方法。
(2)在静态方法中,可能通过“类名.方法或属性名”的方式访问类方法或类属性。

