美文网首页
Python类定义

Python类定义

作者: ylonge | 来源:发表于2017-11-26 19:32 被阅读0次

    类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类定义

          本文链接:https://www.haomeiwen.com/subject/raikbxtx.html