包
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
网友评论