Python类定义

类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

你可能感兴趣的:(Python类定义)