Python

4-面向对象编程

2019-01-15  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读