美文网首页
Python中面向对象编程的一些高级方法拾遗

Python中面向对象编程的一些高级方法拾遗

作者: 超级超级小天才 | 来源:发表于2020-12-05 04:35 被阅读0次

    其他关于Python的总结文章请访问:https://www.jianshu.com/nb/47435944

    Python中面向对象编程的一些高级方法拾遗

    声明类中的私有变量

    定义类中的私有变量,只要将变量名前加双下划线即可__,如果一个变量名以__开头,它就是一个私有变量(private),只能在类内部访问,不能外部访问(比如__name)。

    但是开头结尾都有双下划线__的变量是特殊变量,特殊变量是可以直接访问的,不是private变量,所以不要定义这种变量(比如__name__

    但但是,其实双下划线的变量是可以访问的,需要使用 单下划线+类名+双下划线的变量名 访问(比如Student类中的__name变量,可以使用 instance._Student__name 来访问的),但是既然设置成了私有变量,那就是不想让访问,一定要这么做是没有什么特别的好处的

    实例属性与类属性

    定义在类中的 __init__ 函数中的变量(比如self.name)是属于实例的,即每一个实例都有自己的 self.name。而定义在类中,__init__ 函数外部(前)的变量则是属于类自己的变量,比如这样定义的变量:

    class Student(object):
        name = 'Student'
    

    属于类的属性是不会因实例而异的,所有实例都拥有同样的类属性。

    限制给实例添加的属性

    动态语言中,可以给对象(object)动态添加属性,比如一个student实例,可以临时添加 student.name 的属性,或者给Student类动态添加属性 Student.name,使用 __slots__ 可以限制给一个类的实力添加的属性:

    class Student():
        __slots__ = ('name', 'age')
    

    这样一来Student的实例就只能动态添加nameage两个属性,添加其他的会报错:

    student = Student()
    
    student.name = "Hello"
    student.age = 12
    
    student.score = 100  # Raise AttributeError: 'Student' object has no attribute 'score'
    

    使用@property将方法“变为”属性

    类中,通常为了不暴露一些变量,或者对一些变量的做限制,会猜用定义一个私有变量(比如score),然后使用两个方法:一个get方法来获取变量值(比如get_score)和一个set方法来修改变量的值(比如set_score)来完成。使用时需要调用两个方法。

    使用装饰器 @property 可以更简单的做到这一点,它可以将一个方法“变成”属性:

    • 只使用 @property 定义只读属性:
    class Student():
        @property
        def name(self):
            return "Lily"
    
    
    student = Student()
    print(student.name)
    
    • 使用 @property 和配套产生的 @NAME.setter 来定义可读属性:
    class Student():
    
        @property
        def name(self):
            return self.__name
    
        @name.setter
        def name(self, name):
            self.__name = name
    
    
    student = Student()
    student.name = "Lily"
    
    print(student.name)
    

    多重继承

    Python支持多重继承,即一个子类可以继承自多个父类,只要在子类的括号中传入多个要继承的父类即可:

    class Student():
        pass
    
    class Teacher():
        pass
    
    class Someone(Student,Teacher):
        pass
    

    相关文章

      网友评论

          本文标题:Python中面向对象编程的一些高级方法拾遗

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