Python中的类
Python中定义一个类的方式:
1)Python2中定义类的方式
class 类名:
属性
方法
2)Python3中定义类的方式
class 类名(object): #不继承其他类时使用object类,需要继承父类就在括号内写父类的名称
属性
方法
Python2定义类的方式已经基本不使用
1 类固有的属性和方法
Python中的类有不通过定义就可以使用的属性和方法,这些属性和方法都有特殊的功能和作用,其中这些不定义就存在的方法又叫做魔法方法,它们的名称有固定的格式,即__xxxx__()
1.1 self
属性
self是Python中的类自带的属性,不需要定义即可使用,它是一个指向调用它的对象的引用,可以简单的理解为对象自身的意思
一个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可
1.2 __init__()
方法
用于给新建的对象进行初始化。在对象创建时自动执行,给新建的对象初始化。该方法可以自定义参数,没有返回值
方法的执行时机
其所在的类的对象创建时执行
方法的参数
__init__()
方法有一个默认参数self,位于参数列表的第一位,用于将本对象的引用传递给__init__()
方法。还可以传递自定义参数,格式如下:
def __init__(self, 自定义参数A, 自定义参数B...):
...
下面用一个例子说明__init__()
方法的特点:
# 定义汽车类
class Car:
def __init__(self, newWheelNum, newColor):
self.wheelNum = newWheelNum
self.color = newColor
# 创建对象
BMW = Car(4, 'green')
print('车的颜色为:%s'%BMW.color)
print('车轮子数量为:%d'%BMW.wheelNum)
执行结果为:
由以上例子可以看出__init__()
方法不需要调用,在对象创建时会自动执行。同时可以接收参数给对象的属性赋值(即初始化)
1.3 __new__()
方法
该方法的主要作用就是创建对象,这个方法和__init__()
方法 一样不需要调用,在对象创建时自动执行
方法参数
该方法至少要有一个参数cls,cls代表要实例化的类,此参数在实例化时由Python解释器自动提供
方法返回值
必须要有返回值,返回实例化的实例(即创建出来的对象),这点在自己重写__new__()
方法时要特别注意,可以return父类创建出来的实例,或者使用object类创建出来的实例
class A(object):
def __init__(self):
print("这是 init 方法")
def __new__(cls):
print("这是 new 方法")
return object.__new__(cls) #使用object类创建出来的实例
a = A() #创建对象
1.4 __del__()
方法
创建对象后,python解释器默认调用__init__()
方法给对象初始化,当删除一个对象时,python解释器也会默认调用一个方法,__del__()
方法,用于删除对象
__del__()
方法的参数和__init__()
方法一样,第一个参数为self
,用于将对象的引用传递给方法
当有1个变量保存了对象的引用时,此对象的引用计数就会加1,当使用__del__()
方法删除变量指向的对象时,如果对象的引用计数不为1(假设为3),那么此时只会让这个引用计数减1,变为2,当再次调用__del__()
方法时,变为1,如果再次调用__del__()
方法,这是引用计数为0,没有引用指向该对象,此时就会把对象从内存中删除
2 类自定义的属性和方法
2.1 类属性
属于类的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似
类属性分为共有和私有两类,私有类属性在定义时名称前加两个下划线“__”。对于公有的类属性,在类外可以通过类对象和实例对象访问,而私有的类属性则不可以在类外可以通过类对象和实例对象访问
class People(object):
name = 'Tom' #定义一个公有的类属性
__age = 12 #定义一个私有的类属性
p = People()
print(p.name) #正确
print(People.name) #正确
print(p.__age) #错误,不能在类外通过实例对象访问私有的类属性
print(People.__age) #错误,不能在类外通过类对象访问私有的类属性
2.2 实例属性
属于对象的属性,实例属性通过__init__()
方法进行定义
由于实例属性属于具体的对象,所以实例属性只能通过对象名访问,不能通过类名访问
#定义一个类
class People(object):
address = '山东' #定义一个类属性
def __init__(self):
self.name = 'xiaowang' #定义一个实例属性
self.age = 20 #定义一个实例属性
#创建一个对象
p = People()
#访问实例属性
p.age =12 #修改实例属性
print(p.address) #正确
print(p.name) #正确
print(p.age) #正确
#访问类属性
print(People.address) #正确
print(People.name) #错误
print(People.age) #错误
注:如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去修改,会在实例对象中产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性
class People(object):
country = 'china'
print(People.country)
p = People()
print(p.country)
p.country = 'japan'
print(p.country) #实例属性会屏蔽掉同名的类属性
print(People.country)
del p.country #删除实例属性
print(p.country)
程序执行结果:
2.3 实例方法
类中最常见的方法,其特征是方法的第一个参数为属性self
,其作用是将对象的引用传递给方法
实例对象的创建:
class People(object):
country = 'china'
def getCountry(self):
print (self.country)
2.4 类方法
用修饰器@classmethod修饰的方式为类方法,类方法的第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以“cls”作为第一个参数的名字,所以最好用“cls”),实例对象和类对象都可以调类方法
类方法可以修改类属性
class People(object):
country = 'china'
#类方法,用classmethod来进行修饰
@classmethod
def getCountry(cls):
return cls.country
@classmethod
def setCountry(cls,country):
cls.country = country
p = People()
print p.getCountry() #通过实例对象引用
print People.getCountry() #通过类对象引用
#修改类属性
p.setCountry('japan')
print p.getCountry()
print People.getCountry()
执行结果:
2.5 静态方法
通过修饰器@staticmethod修饰的方法
class People(object):
country = 'china'
@staticmethod
def getCountry():
return People.country
print People.getCountry()