摘要:声明对象构造函数,创建实例需要用到访问限制封装性是面向对象的一大特点,如果要内部属性不被外部调用,需要加上两个下划线这样就没办法直接通过实例来访问这个变量了因为这个时候,变量已经被隐式的变成了继承继承的一般写法为所有的类都继承于这个类。
包
python中包的引用是一个坑,经常出现这个文件夹的代码,引用不到另一个文件夹的代码,这个时候就必须要去更改环境变量,无论如何,总感觉不是一种优雅的做法,为了避免这样的情况出现,做好项目目录结构就显得十分的重要。以 dirsearch 这样的工具为例
一般项目,我们需要设置一个入口文件,用来运行代码,而实现主要功能的,我们可以分散在其他文件夹里面,这样一来,我们就可以跨文件夹调用代码了,因为这些功能代码不是主要运行文件。
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 "", line 1, in
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/w...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/42951.html
摘要:声明式编程一种编程范式,与命令式编程相对立。常见的声明式编程语言有数据库查询语言,正则表达式逻辑编程函数式编程组态管理系统等。函数式编程,特别是纯函数式编程,尝试最小化状态带来的副作用,因此被认为是声明式的。 编程范式与函数式编程 一、编程范式的分类 常见的编程范式有:函数式编程、程序编程、面向对象编程、指令式编程等。在面向对象编程的世界,程序是一系列相互作用(方法)的对象(Class...
摘要:一面向对象编程简介定义,简称,是一种程序设计思想。好处维护简单模块化是面向对象编程中的一个特征。可扩充性面向对象编程从本质上支持扩充性。 一、面向对象编程简介 1.定义: Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。 2.好处: (1)、维护简单:模块化是面向对象编程中的一个...
摘要:二面向对象概述面向过程的设计思想和面向对象的设计思想我要吃鱼香肉丝盖饭面向过程我买菜我洗菜我切菜我放水我点火我做饭我炒菜。。。。 大家好,上次我们讲过了乐字节Java编程之方法、调用、重载、递归,接下来我们将会进入到Java封装的内容。Java编程语言发展,面向对象和类。 一、编程语言的发展 机器语言——直接由计算机的指令组成,指令、数据、地址都以0和1组成:可以被计算机直接识别并执行...
摘要:本文是响应式编程第一章响应式这篇文章的学习笔记。通过代码对比可以发现,在响应式编程中,我们不再用对象的概念来对现实世界进行建模,而是使用流的思想对信息进行拆分和聚合。 本文是Rxjs 响应式编程-第一章:响应式这篇文章的学习笔记。示例代码地址:【示例代码】 更多文章:【《大史住在大前端》博文集目录】 showImg(https://segmentfault.com/img/bVbuE...
摘要:为什么要采用面向对象编程解决问题更容易设计计算机程序就是为了解决人类的问题。面向对象编程需要对业务及代码的架构是有一定的要求的。 1. 编程方式 我们目前的编程方式大体可以有以下三种编程方式: 顺序编程 过程式编程 面向对象编程 在讲面向对象编程时先讲一下什么是顺序编程,什么是过程式编程,什么是面向对象编程: 顺序编程: 就是只用一个单线程去执行一段代码,执行过程根据代码依次从上...
摘要:众多面向对象的编程思想虽不尽一致,但是无论哪种面向对象编程语言都具有以下的共通功能。原型编程以类为中心的传统面向对象编程,是以类为基础生成新对象。而原型模式的面向对象编程语言没有类这样一个概念。 什么是面向对象?这个问题往往会问到刚毕业的新手or实习生上,也是往往作为一个技术面试的开头题。在这里我们不去谈如何答(fu)好(yan)问(guo)题(qu),仅谈谈我所理解的面向对象。 从历...
阅读 2682·2021-11-22 15:25
阅读 1544·2021-11-15 17:59
阅读 1246·2021-09-29 09:34
阅读 1795·2021-09-26 09:46
阅读 3128·2021-09-02 15:40
阅读 1291·2019-08-30 15:56
阅读 3377·2019-08-30 15:55
阅读 768·2019-08-29 17:08