python抽象篇:面向对象基础
1.面向对象概述
面向过程编程:根据操作数据的函数或语句块来设计程序的。
函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象编程:数据和功能结合起来,用称为对象的东西包裹起来组织程序的方法;
在大多数时候你可以使用面向过程编程,但是有些时候当需要编写大型程序或是寻求一个更加合适的解决方案的时候,就需要面向对象的编程,Python既可以提供面向过程的编程,也可以面向对象的编程,归根到底,Python语言是面向对象的编程语言。
2.创建类和对象
__metaclass__=type #确定使用新式类,这句话可以不写,内部自动调用
class Person: #创建类
def setName(self,name):#self是特殊参数,必填
self.name=name def getName(self):
return self.name def greet(self):
print("Hello,%s"%self.name)
>>> foo=Person()#根据类Person创建对象foo,实例化这个类
>>> foo.setName('greg')#执行setName方法,此时的foo就是类Person的实例化对象
>>> foo.greet() #执行greet方法
Hello,greg
#实例化,其实就是以Person类为模版,在内存里开辟一块空间,存上数据,赋值成一个变量名
所有的对象都属于某一个类,称为类的实例(instance)
foo=Person()叫做类的“实例化”, 就是把一个虚拟的抽象的类,通过这个动作,变成了一个具体的对象了, 这个对象就叫做实例
类的执行逻辑
定义类时,所有位于class语句中的代码都在特殊的命名空间中执行——类命名空间(class namespace)。
这个命名空间可由类内所有成员访问,类的定义其实就是执行代码块,在类的定义区并不只限只能使用def语句。
>>>class C:
print("Class C being defined")
#运行
>>>Class C being defined
class Person(object):
def __init__(self, name):
self.name = name def hello(self):
print("hello,%s" %self.name) obj=Person("greg")
obj.hello() #hello,greg
print(Person)#<class '__main__.Person'>
即使不实例化,这个Person类本身也是已经存在内存里了
3.对象的魔力
3.1 多态(Polymorphism):意味着可以对不同类的对象使用相同的操作。
def add(x,y):
return x+y print(add(1,2))
print(add('Fish','license')) def length_message(x):
print("长度:",repr(x),"是",len(x)) print(length_message('gregory'))
print(length_message([1,2,3]))
python里的很多函数和运算符都是多态的,只要使用多态函数和运算符,就会与多态发生关联。
唯一能够毁掉多态的就是使用函数显式地检查类型,比如type,isinstance,issubclass函数等。
多态的形式在Python里也被称为鸭子类型duck typing
class F1:
pass class S1(F1):
def show(self):
print('S1.show') class S2(F1):
def show(self):
print('S2.show') def Func(obj):
print (obj.show()) s1_obj = S1()
Func(s1_obj) s2_obj = S2()
Func(s2_obj)
3.2 封装(Encapsulation): 即对外部世界隐藏对象的工作细节。
封装是指向程序中的其他部分隐藏对象的具体实现细节的原则。和多态类似,也是使用对象而不用知道其内部细节。
区别在于:多态可以让用户对于不知道是什么类(对象类型)的对象进行方法调用,而封装是可以不用关心对象是如何构建的而直接进行使用。
class Person:
def __init__(self,name,age):
#构造方法,类名()自动执行构造方法
self.n=name
self.a=age
self.b='o型'
def show(self):
print('%s-%s-%s'%(self.n,self.a,self.b))
obj1=Person('greg',18)
#直接调用对象的属性
print(obj1.name)
#间接调用
Python默认会将obj1传给self参数,即:obj1.show(obj1)
obj1.show()
在使用面向对象的封装特性时,需要:
1)将内容封装到某处
2)从某处调用被封装的内容
对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。
3.3 继承(Inheritance): 以通用的类为基础建立专门的类对象。
继承
class G:
def g1(self):
print('G.g1')
class F(G): #父类,基类
def f1(self):
print('F.f1')
def f2(self):
print('F.f2')
class S(F): #子类,派生类
def s1(self):
print('S.s1')
def f2(self):
super(S,self).f2() #固定写法,执行父类(基类)中的f2方法
print('S.s2')
# F.f2(self) #执行父类(基类)中的f2方法 obj=S()#self执行当前方法的对象
# obj.s2()#s1中的self是形参,此时代指obj
obj.f2()#self永远指调用方法的调用者
# obj.g1()
self永远是执行方法的调用者
supper(子类,self).父类中的方法 (...)
父类名.父类中的方法(self,...)
多继承
1、Python的类可以继承多个类,Java和C#中则只能继承一个类
2、Python的类如果继承了多个类,从做到右一次查找,找不到会报错
class Base:
def a(self):
print('Base.a')
class F0(Base):
def a1(self):
print('F0.a')
class F1(F0):
def a1(self):
print('F1.a')
class F2(Base):
def a(self):
print('F2,a')
class S(F1,F2):
pass
obj=S()
obj.a() #从左到右找,查找顺序S-->F1-->F2
python抽象篇:面向对象基础的更多相关文章
- Python入门篇-面向对象概述
Python入门篇-面向对象概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.语言的分类 面向机器 抽象成机器指令,机器容易理解 代表:汇编语言 面向过程 做一件事情,排出个 ...
- 8.python笔记之面向对象基础
title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...
- python抽象篇:面向对象
1.面向对象概述 面向过程编程:根据操作数据的函数或语句块来设计程序的. 函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象编程:数据和功能结合起来,用称为对象的东西包 ...
- python之路 面向对象基础 XML
一.面向对象基础 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...
- Python学习之面向对象基础
python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...
- Python 抽象篇:面向对象之高阶用法
1.检查继承 如果想要查看一个类是否是另一个类的子类,可以使用内建的issubclass函数 如果想知道已知类的基类,可以直接使用特殊特性__bases__ 同时,使用isinstance方法检查一个 ...
- Python 抽象篇:面向对象之类的方法与属性
概览:类成员之字段:-普通字段,保存在对象中,执行职能通过对象访问-静态字段,保存在类中,执行可以通过对象访问,也可以通过类访问类成员之方法:-普通方法,保存在类中,由对象来调用,self->对 ...
- python 15篇 面向对象
1.面向对象编程概念 面向对象是包含面向过程 面向过程编程 买车: 1.4s看车,买车 2.上保险 保险公司 3.交税 地税局 4.交管所 上牌面向对象编程 卖车处: 1.4s 2.保险 3.交税 4 ...
- Python学习笔记——面向对象基础
1.类和实例 1.1类的定义 类的定义使用class关键字,其后紧跟类名(通常大写开头),紧接着是(object),object是该类继承的类名,没有就继承object类. 实例化时就是类名+(),有 ...
随机推荐
- 一、JVM — Java内存区域
Java 内存区域详解 写在前面 (常见面试题) 基本问题 拓展问题 一 概述 二 运行时数据区域 2.1 程序计数器 2.2 Java 虚拟机栈 2.3 本地方法栈 2.4 堆 2.5 方法区 2. ...
- package.json的所有配置项及其用法,你都熟悉么
写在前面 在前端开发中,npm已经是必不可少的工具了.使用npm,不可避免的就要和package.json打交道.平时package.json用得挺多,但是没有认真看过官方文档.本文结合npm官方文档 ...
- 剑指offer 打印从1到最大的n位数
题目描述: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999. 分析:注意不能直接输入最大的n位十进制数,因为可能属于大数,这个数无法用int或 ...
- django基础篇06-ModelForm操作及验证
本文内容主要来自银角大王的博客 学习大纲: 一.ModelForm 二.Ajax - 原生(jQuery) - 伪Ajax操作 三.文件上传(预览) - Form提交 - Ajax文件上传 四. 图片 ...
- 从零开始学MySQL(四)
上节连接:https://www.cnblogs.com/RajXie/p/10880809.html 上节说到,在创建表的同时,需要给出列的定义.列的定义可展开如下: 列名 列的数据类型 列的一些其 ...
- linux 建立 MySQL 账号
以 root 身份登录 Linux 系统,创建 mysql 组和用户 [root@Nagios-Server ~]# groupadd mysql [root@Nagios-Server ~]# us ...
- mail - 发送和接收邮件
SYNOPSIS(总览) mail [-iInv ] [-s subject ] [-c cc-addr ] [-b bcc-addr ] to-addr... mail [-iInNv -f ] [ ...
- python初步学习
一.字符编码 ASCII表是是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256-1,所以,ASCII码最多只能表示 ...
- PAT Advanced 1019 General Palindromic Number (20 分)
A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...
- vb中typename函数
适用于获得一个变量的类型名称的, 比如 A 是一个字符串变量,那么 TypeName(A)=String