1.构造函数和析构函数
类的构造函数为__init__,析构函数为__del__。这两个函数至少要有一个参数self。
class Student:
def __init__(self):
pass
def __del__(self):
pass
__init__和__del__都是可选的。如果用户不提供,python会提供默认的构造函数和析构函数。
创建类的对象时会自动__init__使用del来删除对象的时候会自动调用__del__。
1.1类的初始化参数
__init__的参数个数决定了创建类对象时需要的参数个数。
如果构造函数的原型为__init__(self),则类创建对象参数个数为0。创建对象时的方式为
#类定义
class Student:
def __init__(self):
pass
#创建对象方式
stu = Student()
如果构造函数的原型为__init__(self, x),则类创建对象参数个数为1。其它以此类推。此时创建对象的方式为
#类定义
class Student:
def __init__(self, x):
pass
#创建对象方式
stu = Student("a")
2.变量
2.1变量的类型
类有三种类型变量:类变量、成员变量、局部变量。先看具体的定义。
类变量:在所有函数之外,在类之内定义。
成员变量:在__init__函数内定义,以"self."开头。
局部变量:非__init__函数中定义的变量或者__init__中不以"selft."开头定义的变量。除了类变量和成员变量之外的变量。
举个例子。
class Student:
#类变量
count = 0
def __init__(self, x):
#name是一个成员变量
self.name = x
def SetAge(self, y)
#age是一个局部变量
self.age = y
#local_var是一个局部变量
local_var = y
2.2 类变量和成员变量的异同
2.2.1 共同点
- 类变量和成员变量在每个对象中都有自己的拷贝。
- 类变量和成员变量的作用于都为整个类,通过self.xxxx即可引用
2.2.2 区别
成员变量更多用于存储创建对象时需要自定义赋值,而每个对象在创建时,都拥有相同初始状态的类变量。
因此类变量更多用来存放类共有的常量,类似于C++的const变量。
举个例子。
class Student:
__school = "MIT"
def __init__(self, x):
self.__age = x
def GetAge(self):
return self.__age
def SetAge(self, a):
self.__age = a
def SetSchool(self, s):
self.__school = s
def GetSchool(self):
return self.__school
if __name__ == "__main__":
s1 = Student(24)
s2 = Student(20)
print s1.GetSchool()
print s2.GetSchool() #s1, s2都拥有默认的__school值
s1.SetSchool("Yale")
s2.SetSchool("Harvard")
print s1.GetSchool()
print s2.GetSchool() #s1, s2 的值不同,证明类变量在每个对象都有自己的存储空间
2.3类变量的权限控制
python的类没有十分明确的权限控制,默认所有非局部变量都可以在类外部直接访问。例如
class Student:
#类变量
count = 0
def __init__(self, x):
#name是一个成员变量
self.name = x
def SetAge(self, y)
#age是一个局部变量
self.age = y
#local_var是一个局部变量
local_var = y
#在类外部,我们可以这样子访问
s = Student("jack")
print s.count #访问类变量,OK
print s.name #访问成员变量,OK
print s.age #访问局部变量,出错
print s.local_var #访问局部变量,出错
2.3.1 限制访问权限
我们可以限制外部对成员变量和类变量的访问,将其变成私有,使类无法在外部直接访问。具体方法是在类变量和成员变量前加"__"。例如
class Student:
__count = 0
def __init__(self, x):
self.__age = x
#访问类变量和成员变量
s = Student()
print s.__count #出错
print s.__age #出错
3.函数
3.1函数的类型
类的函数类型分三种:成员函数、类函数、静态函数
成员函数:函数的第一个参数为self
类函数:用@classmethod修饰的函数
静态函数:用@staticmethod修饰的函数
访问方式分别为:
成员函数:instance.member_func()
类函数:instance.member_func()或者class_name.func()
静态函数:跟类函数一样。
要注意的是,静态函数是不可以访问任何成员变量和类变量的。类函数可以访问类变量和成员函数,但是不能直接访问成员变量。
举个例子。
class Student:
__bar = "bar"
def __init__(self, a):
self.__age = a
#成员函数
def SetAge(self, a)
self.__age = a
def GetAge(self):
return __age
#类函数
@classmethod
def GetAge(cls):
print cls.__age # 访问成员变量,出错
print cls.__bar # 访问类变量,OK
print cls().GetAge() # 访问成员函数,OK。注意cls的写法。
#静态函数
@staticmethod
def AddAge(a, b):
print self.__age # 不允许访问成员变量
return a+b
if __name__ == "__main__":
s = Student(10)
s.SetAge(20)
print s.GetAge()
print Student.GetAge()
print s.AddAge(20, 21)
print Student.AddAge(20, 21)
3.2 函数的访问权限
跟类变量一样,默认成员函数的权限为公开的。要想设置成员函数为私有,可以在函数明前加"__",即可限制为只能在类内部访问成员函数。
参考:
Python-类变量,成员变量,静态变量,类方法,静态方法,实例方法,普通函数
python中的实例方法、静态方法、类方法、类变量和实例变量浅析