类class
类定义
python中的类通过关键字class定义,类名以大写字母开头,并可以继承已有类:
# Person类继承object类
class Person(object) :
pass
# 使用Person()定义实例对象mike
mike = Person()
属性赋值
实例属性
class定义的实例包含不同的属性,实例的属性也可以被赋值为不同的属性:
mike = Person()
mike.name = 'Mike'
mike.gender = 'Male'
mike.birth = '1998-1-1'
# 由于Python是动态语言,可以动态为实例添加属性
mike.address = 'China'
实例属性可以通过默认执行的init()函数进行初始化:
class Person(object) :
# __init__函数的第一个参数是留给指向外包的实例变量的,这里为了明确物理意义,用self指代实例自身,当然也可以用其他名称
def __init__(self, name, gender, birth) :
self.name = name
self.gender = gender
self.birth = birth
# 在定义实例时,类的参数从第二个参数开始赋值
mike = Person(name, gender, birth)
类属性
与实例属性不同,类属性是绑定在class类本身上的,对于一个class来说只有一份,对于不同的实例也只有一份,而实例属性对于不同的实例可能是不同的:
# 定义类属性
class Person(object) :
address = 'Earth' # 类属性
def __init__(self, name) :
self.name = name # 实例属性
# 通过类访问类属性
print(Person.address)
# 通过类定义的实例访问类属性
mike = Person()
print(mike.address)
由于类属性只有一份,当类属性被修改时,通过所有实例调用类属性的返回值都会被改变。
当类属性名和实例属性名重复时,通过实例访问该命名属性会优先返回实例属性,因为实例属性优先级高于类属性。
类属性可以通过类访问
类属性的访问权限限制
在类的属性定义中,有些属性是不希望被外部访问的,通过在属性名前加双下划线'__'表示该属性不可被外部访问:
# 命名前加双下划线的属性不可被外部访问
__attribute
# 前后都加双下划线的属性被称为特殊属性,可以被外部访问
__attribute__
# 前面加单下划线的属性可以被外部访问,但是按照习惯,不应该被外部访问
_attribute
定义方法
定义实例方法
定义实例的方法就是在类中定义函数,函数的第一个参数永远是self,指向实例本身:
class Person(object) :
def __init__(self, name) :
self.__name = name
def get_name(self) :
return self.name
定义类方法
类方法与实例方法的关系类似于类属性与实例属性的关系,类方法绑定在类上,类方法也可以通过类或实例调用:
class Person(object):
__count = 0
@classmethod # 通过装饰器classmethod装饰类方法
def how_many(cls) :
return cls.__count
def __init__(self, name) :
self.name = name
Person.__count += 1
类继承
class Person(object) :
def __init__(self, name, gender) :
self.name = name
self.gender = gender
class Student(Person) :
def __init__(self, name, gender, score) :
# 通过super()访问Student继承的类Person,并调用Person的__init__函数,如果不调用的话,Student会没有Person的两个属性。
super(Student, self).__init__(name, gender)
self.score = score
类的多态
继承类和父类的同名函数实现类的多态性,并且继承类的函数优先级更高。
多重继承
class A(B,C) :
pass
类的特殊方法
可以为自定义类定义特殊方法,相当于函数重载。
- str() :将类的实例变为str,并显示给用户。
- repr():将类的实例变为str,并显示为开发人员。
- cmp():比较函数。如果输入左值在前,返回-1,如果输入右值在前,返回1。
- len():返回实例长度。
- add():加法。
- int(): 类型转换为整数。
- float():类型转换为浮点数。
- slot():建立一个允许在类中添加的属性列表。
class Student(object):
__slots__ = ('name', 'gender', 'score')
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
- call():将一个类实例变为一个可调用对象。
@property装饰器
@property装饰器可以将函数重载为属性,使得函数可以像属性一样被调用:
class Student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
# @property为函数增加获取属性操作
@property
def score(self):
return self.__score
# @property的setter为函数增加赋值属性操作
@score.setter # 在已经装饰过的score上操作
def score(self, score):
if score < 0 or score > 100
raise ValueError('invalid score')
self.__score = score