美文网首页Python
4-面向对象编程

4-面向对象编程

作者: 神秘加冰 | 来源:发表于2019-01-15 17:01 被阅读0次

    python中包的引用是一个坑,经常出现这个文件夹的代码,引用不到另一个文件夹的代码,这个时候就必须要去更改环境变量,无论如何,总感觉不是一种优雅的做法,为了避免这样的情况出现,做好项目目录结构就显得十分的重要。以 dirsearch 这样的工具为例


    1600893136-5c3496614c07d_articlex.png

    一般项目,我们需要设置一个入口文件,用来运行代码,而实现主要功能的,我们可以分散在其他文件夹里面,这样一来,我们就可以跨文件夹调用代码了,因为这些功能代码不是主要运行文件。

    面向对象

    Python面对对象的实现,采用的是“鸭子模型”的方式,什么是鸭子模型,一个动物,只要它叫声像鸭子,走路像鸭子,行为举止动作思想等等方面像鸭子,那么在python里面,就说明这是一只鸭子。 怎么理解呢? 比如说,Iterator 对象是因为内部有一个iter方法,所以才被称之为Iterator 对象,所以在python里面,只要声明一个对象,并且实现了iter 方法,那么声明的这个对象就是 Iterator 对象。

    声明对象

    class Student(object):
        # 构造函数,创建实例需要用到
        def __init__(self):
            pass 
    

    访问限制

    封装性是面向对象的一大特点,如果要内部属性不被外部调用,需要加上 __ 两个下划线

    class Student(object):
         def __init__(self,name):
             self.__name = name
    

    这样就没办法直接通过实例来访问这个变量了

    >>> bart = Student('Bart Simpson')
    >>> bart.__name
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Student' object has no attribute '__name'
    

    因为这个时候,__name 变量已经被隐式的变成了 _Student__name

    继承

    继承的一般写法为:

    class Animal(object):
        pass
        
    class Cat(Animal):
        pass
    

    所有的类都继承于 object 这个类。所要注意的是,在继承父类的时候,也会同时继承其构造函数,但是如果要给子类添加一些新的属性时候要怎么办? 比如说父类是一个比较模糊的名词,Animal,创建的实例Cat要有一个名字 name,这个时候,name就是子类新的属性。例子:

    class Animal(object):
        def __init__(self,feather):
            self.feather = feather
        # 是否有羽毛
        def is_feather(self):
            return self.feather
    
    class Bird(Animal):
        def __init__(self,name,age,*args,**kw):
            self.name = name
            self.age = age
            super(Bird,self).__init__(*args,**kw)
        
        def is_feather(self):
            return self.feather
    

    多态

    因为是鸭子类型,所以多态也不是严格意义上的多态。 只是一个参数上的形式而已。

    使用slots

    使用 slots 可以 限制类的实例赋值,比如,要限制 Student 的实例,只能添加 name 和 age 两个属性,其他的不允许,就可以这么做:

    # coding: utf-8 
    class Student(object):
        __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
        def __init__(self):
            pass
       
    if __name__ =="__main__":
        s = Student()
        s.scope = 100
    # 输出:  AttributeError: 'Student' object has no attribute 'scope' 
    

    使用@property

    这个属性主要是针对对象的封装性的,对象的属性一般是不应该通过实例直接来设置,一般还需要设置 get 和 set 方法。 @property 就是这么来使用的。例子

    class Student(object):
        @property
        def score(self):
            return self._score
            
        @score.setter
        def score(self, value):
            if not isinstance(value, int):
                raise ValueError('score must be an integer!')
            if value < 0 or value > 100:
                raise ValueError('score must between 0 ~ 100!')
            self._score = value
    

    参考

    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318645694388f1f10473d7f416e9291616be8367ab5000

    相关文章

      网友评论

        本文标题:4-面向对象编程

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