python--基础知识点梳理(二)面向对象
面向过程:根据业务逻辑从上到下写代码
面向对象:将数据与函数绑定在一起,进行封装,优点:快速高效 ,减少代码重写
面向对象三大特性:封装、继承、多态
# 封装的意义,隐藏实现细节
将属性和方法放到一起做为一个整体,然后通过实例化对象来处理;
隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了;
对类的属性和方法增加 访问权限控制。
# 继承的意义,代码复用
1. 一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
2. 比如CS中的警察和恐怖分子,可以将两个角色的相同点写到一个父类中,然后同时去继承它
3. 使用经典类: Person.__init__(self,name,age) 并重写写父类Person的构造方法,实现,先覆盖,再继承,再重构
# 多态的意义 ,接口重用
1.多态是面向对象的重要特性,简单点说:“一个接口,多种实现”
2. 指一个基类中派生出了不同的子类,且每个子类在继承同样的方法名的同时又对父类的方法做了不同的实现
3. 这就是同一种事物表现出的多种形态
4. 比如黄种人继承了人talk这个功能,但是他说的是中文,而美国人的talk是英文,但是他们是同样的talk
class Role(object): #1、在定义类时继承object就是新式类,没有就是就是旧类式
public_object = "public" #2、在类例定义一个公有属性:所有实例都能访问的属性叫“公有属性”
def __init__(self,name,role,weapon,life_value=100,money=15000): #构造函数==初始化方法:模板
self.name = name #3、普通属性
self.__heart= "Normal" #4、私有属性在外面无法访问
def shot(self): #5、类的方法
print("%s is shooting..."%self.name) r = Role('zhangsan','boss','gun')
r.shot()
类方法、静态方法、属性方法
类方法:是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。
类方法:可以通过类对象引用,也可以通过实例对象引用,类对象不访问实例变量
class People(object):
# 私有类属性
__country = 'china'
#类方法,用classmethod来进行修饰
@classmethod
def get_country(cls):
return cls.__country
@classmethod
def set_country(cls,country):
cls.__country = country p = People()
print(p.get_country()) #可以用过实例对象访问
print(People.get_country()) #可以通过类访问
p.set_country('japan')
print(p.get_country())
print(People.get_country())
静态方法:静态方法可以更好的组织代码,防止代码变大后变得比较混乱。静态方法只是名义上归类管理,实际上在静态方法里访问不了类或则实例中的任何属性
静态方法:需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。
class People(object):
country = 'china'
@staticmethod
#静态方法
def get_country():
return People.country
p = People()
# 通过对象访问静态方法
p.get_country()
# 通过类访问静态方法
print(People.get_country())
属性方法:把一个方法变成一个属性,隐藏了实现细节,调用时不必加括号直接d.eat即可调用self.eat()方法
class Dog(object):
def __init__(self, name):
self.name = name
@property
def eat(self):
print(" %s is eating" % self.name)
d = Dog("xiaolutongxue")
d.eat
# 调用会出以下错误, 说NoneType is not callable, 因为eat此时已经变成一个静态属性了,
# 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了
公有属性、私有属性、普通属性
# 1. 公有属性:在内存中仅存一份
# 2. 普通属性:每个实例对象在内存存一份
# 3. 私有属性:实例在外部无法调用
单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点。
优点:对唯一实例的受控访问,相当于全局变量,但是又可以防止此变量被篡改。太多实例对象也会造成资源浪费
# 实例化一个单例
class Singleton(object):
__instance = None
def __new__(cls,age,name):
# 如果类属性的值为None,那么就创建一个对象,并且赋值这个对象的应用,下次调用这个方法时就可以判断已有实例化对象
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance s = Singleton(11,'xiaolu')
g = Singleton(13,'xiaolu')
print(id(s))
print(id(g))
反射:通过字符串的方式去调用某个函数。
应用:比如在django中的类视图,我们定义了def post或def get就可以直接调用了响应的请求方式,其实底层就是用反射实现。
super()的作用:
# 子类继承了多个父类,如果父类类名修改了,那么子类也要涉及多次修改。而且需要重复写多次调用,显得代码臃肿。 使用super() 可以逐一调用所有的父类方法,并且只执行一次。调用顺序遵循 mro 类属性的顺序。 注意:如果继承了多个父类,且父类都有同名方法,则默认只执行第一个父类的(同名方法只执行一次,目前super()不支持执行多个父类的同名方法) super() 在Python2.3之后才有的机制,用于通常单继承的多层继承。
出处:https://www.cnblogs.com/xiaonq/p/7880547.html#i11
python--基础知识点梳理(二)面向对象的更多相关文章
- 最全Python基础知识点梳理
本文主要介绍一些平时经常会用到的python基础知识点,用于加深印象,也算是对于学习这门语言的一个总结与回顾.python的详细语法介绍可以查看官方编程手册,也有一些在线网站可以学习 python语言 ...
- Golang 基础之基础语法梳理 (二)
大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第二章节 Golang 基础之基础语法梳理 (一) Gol ...
- python基础篇(二)
PYTHON基础篇(二) if:else,缩进 A:if的基础格式和缩进 B:循环判断 C:range()函数和len()函数 D:break,contiue和pass语句 for,while循环 函 ...
- java基础知识点补充---二维数组
#java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...
- python基础扩展(二)
python基础扩展(二) 常用操作 1.startswith(以什么开始) endswith(y)什么结束 s='taiWanw39dd' print(s.startswith('t')) #意思是 ...
- Python基础知识点总结
Python基础知识与常用数据类型 一.Python概述: 1.1.Python的特点: 1.Python是一门面向对象的语言,在Python中一切皆对象 2.Python是一门解释性语言 3.Pyt ...
- python基础知识(二)
以下内容,作为python基础知识的补充,主要涉及基础数据类型的创建及特性,以及新数据类型Bytes类型的引入介绍
- Python基础知识点小结
1.Python基础知识 在Python中的两种注释方法,分别是#注释和引号(''' ''')注释,#注释类似于C语言中的//注释,引号注释类似于C语言中的/* */注释.接着在Python中 ...
- Java基础知识点(二)
前言:Java的基础知识点不能间断. 1.Array和ArrayList的区别 关于Array的用法,参看:http://blog.csdn.net/b_11111/article/details/5 ...
- (Python基础教程之二十二)爬虫下载网页视频(video blob)
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
随机推荐
- 发送RCS 消息摘录相关成功log
//11-25 16:48:09.612102 2175 2726 I BugleDataModel: PendingMessagesProcessor: process from InsertN ...
- 记,NSProxy需要实现哪些方法?
转注出:https://www.cnblogs.com/xiaobajiu/p/10799962.html 使用NSProxy做替身,代理,多继承,本质上都是用它来转发消息给真身. 观察头文件,NSP ...
- CODING 2.0:为什么我们需要 DevOps
CODING 在前两天的 Kubecon 2019 大会上发布了 CODING 2.0.这背后是 CODING 对研发管理和研发团队组建的思考.从 CODING 成立以来,我们一直在探索"让 ...
- Java_枚举Enum基本使用
特性 在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类: 在 Java 中使用 enum 关键字来定义枚举类,其地位与 c ...
- VMware Workstation虚拟机安装CentOS-7-Minimal经验分享
本文主要为0基础的小白准备,有一定经验的大神请忽略.因为最近刚接触linux,在其中也是遇到无数的弯路,本着互惠互利原则,特写这个博客,希望后来人能少走点弯路,更快的进入状态.话不多说,上货. 一,首 ...
- unittest框架之 BeautifulReport 模板报告生成的正确姿势
使用unittest框架的自动化测试,报告一定很重要,目前介绍一个比较高大上的报告模板 BeautifulReport.如果首次使用的话需要安装 pip install beautifulreport ...
- 对Windows桌面应用程序进行UI自动化测试
题记:本文简述如何利用appium对Windows桌面应用程序进行UI自动化测试. 所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows ...
- 关于Mysql修改帐号密码的多种方法
方法一: 登录Mysql进行修改(mysql的小黑框) 命令: set password for 用户名(一般为root) @localhost=password('新密码'); 方法二: 登录MyS ...
- 记录自己的一次pjax性能优化
什么是pjax? pjax = ajax + pushState 通过ajax让页面进行局部刷新,然后通过pushstate让url发生改变,再让pushState,让页面产生一个回退的记录,从而让页 ...
- adb devices无法连接mumu模拟器
解决方案: 如果你的android环境能够直接访问 adb 的相关指令.只需要把mumu模拟器打开 然后打开cmd -> 输入 adb connect 127.0.0.1:7555 就能直接连上 ...