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

2020-12-05  本文已影响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 可以更简单的做到这一点,它可以将一个方法“变成”属性:

class Student():
    @property
    def name(self):
        return "Lily"


student = Student()
print(student.name)
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
上一篇下一篇

猜你喜欢

热点阅读