python之面向对象
首先我们应该知道,python在设计之初就已经是一门面向对象的语言,所以说python中创建一个类和对象是很容易的。
面向对象的技术简介
- 类(class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法,对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不做实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及实例对象的相关数据。
- 方法重写:如果从父类继承的方法不能够满足子类的需求,可以对其进行改写,这个过程的方法叫覆盖,也称方法的重写。
- 实例变量:定义在方法中的变量,只用于当前实例中的类。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类中定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
创建类
创建类,class是关键字,就好比函数中的def 一样。基本格式如
class ClassName:
def 函数名(self):
pass
obj = ClassName()
obj.函数名() #执行
创建类中,函数后面的self是必写的参数,相当于传的对象,而obj此时代表的就是一个对象。例如一个简单实例
class foo:
def f(self, args): return args
s = foo()
ret = s.f("你很帅")
print(ret)
面向对象的三大特性:封装、继承、多态
封装
就是把内容封装在某处,日后好调用。首先看一个例子
class foo:
def f(self,args):
print(self.name, self.age, self.gender,args)
z = foo()
z.name = "flash"
z.age = 18
z.gender = "man"
z.f("你很帅") #这种也能实现封装的功能,但是会传很多参数,显得比较low
其实在类中有种自带的特殊的方法:构造方法,这让我们实现封装会比较方便和美观了。如
class Person:
def __init__(self, name, age):
self.n = name
self.a = age
def foo(self):
print(self.n, self.a) flash = Person("Flash",20)
flash.foo() #注:此时的__init__是构造方法,他会根据类创建的时候自动执行。
继承
和现实中的继承类似,都是子类继承父类。继承中默认是全部继承过来,但也可以只继承优点。首先看一个全部继承的例子。
class Father:
def eat(self):
print("吃饭")
def drink(self):
print("喝水") class Son(Father):
def sink(self):
print("la") obj = Son()
obj.sink()
obj.eat()
obj.drink()
全部继承
有时我们不想全部继承,这是我们只需要修改一下就行
class Father:
def eat(self):
print("吃饭")
def drink(self):
print("喝水") class Son(Father):
def drink(self):
print("la")
super(Son, self).drink()#执行父类中的drink的方法
obj = Son()
obj.drink()
部分继承
那么问题来了,如果一个子类有两个父类,每个父类又各有自己的父类,他们的父类又有相同父类怎么办?
在python中遵循先左后右,一条道走到黑,有相同父类时,父类最后执行的原则。
例如下面这个例子
class base:
pass
class F2(base):
def a(self):
print("f2.a")
self.b()
def b(self):
print("f2.b")
class F3(F2):
def b(self):
print("f3.b")
class Son(F3,F2):
pass obj = Son()
obj.a()
多继承
多态
类成员的字段和方法
应用场景
如果对象中需要保存一些值,执行某功能时,需要使用对象中的值 -> 普通方法
不需要任何对象中的值,静态方法
字段
- 普通字段:保存在对象中,执行只能通过对象访问。
- 静态字段:保存在类中, 执行 可以通过对象访问 也可以通过类访问。
方法
- 普通方法,保存在类中,由对象来调用,self=》对象
- 静态方法,保存在类中,由类直接调用
- 类方法,保存在类中,由类直接调用,cls=》当前类
属性
按方法的方式去定义,按字段的模式去调用
例如
class provice:
country = "中国" #静态字段属于类
def __init__(self,n):
self.name = n #普通字段属于对象 henan
print(self.name) henan = provice("河南")
print(provice.country)
henan.name
字段
class Foo:
def f1(self): #普通方法
print(123) @staticmethod #静态方法
def sta():
print(1,2) @classmethod #类方法
def classmd(cls):
print("a,b") @property #属性
def per(self):
print("aaa")
obj = Foo()
obj.f1() Foo.sta() #调用静态方法,不用创建对象 Foo.classmd() #调用类方法 obj1 = Foo() #调用属性
obj1.per
方法
例如用常用的property属性求分页的问题
class Paragnation:
def __init__(self,page):
try:
p = int(page)
except Exception as e:
p = 1
self.page = p
@property
def start(self): p = (self.page -1) * 10
return p
@property
def end(self): p = self.page * 10
return p
li = []
for i in range(1000):
li.append(i)
while True:
p = input("请输入页码:")
obj = Paragnation(p)
print(li[obj.start:obj.end])
property
成员修饰符
- 共有成员
- 私有方法
其中私有成员的表示方法为:双下划线+字段名(__字段名)
私有成员外部不能访问,外部若访问,只能通过类里面的方法间接访问。例如
class F:
def __init__(self):
self.__age = 18
def Show(self):
return self.__age class S(F):
def __init__(self, name, gender):
self.name = name
self.gender = gender
super(S, self).__init__() def show(self):
print(self.name)
# print(self.__age) #子类不能继承到父类的私有变量,否则会报错,如果要继承可以通过父类的共有方法间接访问
print(self.gender) P = S("flash","男")
P.show()
r = P.Show()
print(r)
私有方法
注:子类继承不了父类的私有方法,也就是说,在子类中不能直接访问父类的私有方法,只能通过父类的方法间接去访问。
python中常见的特殊成员
__init__ 类()自动执行
__del__ del 对象[222]
__call__ 对象() 类()() 自动执行
__int__ int(对象)
__str__ str() __add__ #对象的封装的加法
__dict__ # 讲对象中封装的所有内容通过字典的形式返回
__getitem__ # 切片(slice类型)或者索引
__setitem__
__delitem__ __iter__
# 如果类中有 __iter__ 方法,对象=》可迭代对象
# 对象.__iter__() 的返回值: 迭代器
# for 循环,迭代器,next
# for 循环,可迭代对象,对象.__iter__(),迭代器,next
# 1、执行li对象的类F类中的 __iter__方法,并获取其返回值
# 2、循环上一步中返回的对象
异常处理
常用语数据库处理
主要语法块
try:
自定义内容
except Exception as e:
print("消息")
下面列出几种常见模式
try:
i = int(input("输入>>>>")) except IndexError as e:
print("IndexError", e)
except ValueError as e:
print("ValueError",e)
except Exception as e:
print("Exception",e)
else:
print(i)
finally:
print("success")
class Foo(Exception):
def __init__(self,msg):
self.message = msg def __str__(self):
return self.message
try:
raise Foo("I'm error")
except Foo as e:
print(e)
自定义模块
反射
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age
def show(self):
print("%s-%s" % (self.name, self.age)) obj = Foo("flash", 18)
# print(obj.name) func = getattr(obj, "name")
print(func)
func1 = getattr(obj, "show")
print(func1()) print(hasattr(obj, "name")) setattr(obj, "gender", "man")
print(obj.gender) delattr(obj, "name")
obj.name
例子
单例模式
class Foo:
V = None @classmethod
def func(cls):
if cls.V:
return cls.V
else:
cls.V = Foo()
return cls.V obj = Foo.func()
print(obj.V)
print(obj)
obj1 = Foo.func()
print(obj1)
例子
python之面向对象的更多相关文章
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- Python的面向对象3
接下来,我们接着讲Python的面向对象,在上一次的博客中,我们详细介绍了类与对象的属性,今天,我们来详细介绍一下面向对象中的方法! 1.定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外 ...
- Python的面向对象2
我们接着讲解Python的面向对象 1.初始化实例属性 在现实生活中,一种类型的实例会具有相同的某些属性,把这些实例划分为一个类型,则这些实例必然有相似的部分.但是,在创建实例之后,我们一个一个的为实 ...
- Python的面向对象1
今天,我们来介绍Python的面向对象编程,其实面向对象并不陌生,在C++ ,Java ,PHP中也有大量使用! 好了,我们来步入正题! 那什么是面向对象编程呢? 1. 面向对象编程是一种程序设计 ...
- My way to Python - Day05 - 面向对象-思维导图
My way to Python - Day05 - 面向对象 思维导图
- Python进阶---面向对象的程序设计思想
Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
- Python之面向对象一
引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- python基础——面向对象进阶
python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...
- python基础——面向对象的程序设计
python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
随机推荐
- Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
- Win7 命令行强制杀死进程
原理 1.查看当前正在运行的进程 tasklist 如下图所示 2.强制杀死映像名称为imagename的进程,映像名称可通过任务管理器或tasklist命令查看 taskkill /im image ...
- jquery插件扩展的学习
jquery插件的学习可以点击这里 举个例子 //首先先来一个插件 (function($){ $.fn.extent({ bigfont:function(){ return this.css('f ...
- Android studio 软件板块
- 再谈 Mysql解决中文乱码
一是要把数据库服务器的字符集设置为 utf8. 数据库的字符集会跟服务器的字符集一起变化, 也会变成 utf8: 在/etc/my.cnf中, 的 [mysqld]中, 设置 character-se ...
- R自动数据收集第二章HTML笔记2(主要关于htmlTreeParse函数)
包含以下几个小的知识点 1htmlTreeParse函数源码和一些参数 2hander的写法 3关于missing函数 4关于if-else语句中else语句的花括号问题 5关于checkHandle ...
- JSP内置对象之request对象【学习笔记】
request对象是JSP中重要的对象,每个request对象封装着一次用户的请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径. 一.获取请求头与 ...
- 用Model-View-ViewModel构建iOS App
如果你已经开发一段时间的iOS应用,你一定听说过Model-View-Controller,即MVC.MVC是构建iOS App的标准模式.然而,最近我已经越来越厌倦MVC的一些缺点.在本文,我将重温 ...
- C和指针 第十六章 标准函数库 本地跳转setjmp.h
setjmp和longjmp提供一种类似goto语句的机制,但它的作用域不局限于同一个函数的作用域之内.这些函数可以用于深层次的嵌套函数调用链. int setjmp(jmp_buf state); ...
- C#调用百度地图 api
转 http://blog.csdn.net/kkkkkxiaofei/article/details/8663377 这一篇,记录一下我调用的地图API实现的功能.下面介绍的都是一些片段的节选,不 ...