面向对象程序设计

面向过程编程:就是分析问题的解决步骤,按部就班的编写代码解决问题

函数式编程:就是把代码封装到函数中,然后在使用时调用封装好的函数

面向对象编程:把一类事物所共有的属性和行为提取出来,从而增加程序的扩展性

一、什么是面向对象程序设计?

  面向对象程序设计(Object-oriented programming,OOP)是一种程序设计范型,也是一种程序开发方法。将一类事物的动作和特征整合到一起就是面向对象程序设计

二、什么是类?什么是对象?

  类:一类事物共有的特征和行为

  对象:某个具有类中属性和行为的个体

三、类的声明

 class Foo(object):#新式类,
pass class Foo():#经典类
pass
"""
在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性;反之,即不由任意内置类型派生出的类,则称之为“经典类”。 “新式类”和“经典类”的区分在Python 3之后就已经不存在,在Python 3.x之后的版本,因为所有的类都派生自内置类型object(即使没有显示的继承object类型),即所有的类都是“新式类”。
"""

四、类的属性

  数据属性:类中的变量

  函数属性:类中定义的方法

五、类内置方法

  ①__dict__属性字典

    对象的属性字典只有数据属性,因为对象之间是共享类的函数属性的

    类的属性字典,包括类的数据属性和函数属

 class Foo(object):
x = 10
def __init__(self,a):
self.a = a
def show_a(self):
print(self.a) f1 = Foo(2)
print(f1.__dict__)
print(Foo.__dict__) {'a': 2}
{'__module__': '__main__', 'x': 10, '__init__': <function Foo.__init__ at 0x000002A051CC4AE8>, 'show_a': <function Foo.show_a at 0x000002A051CC4B70>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}

属性字典

  ②__name__类名

print(Foo.__name__)

Foo

类名

  ③__bases__基类

 class Foo():
pass class Boo(Foo):
pass print(Boo.__bases__)#返回元组形式 (<class '__main__.Foo'>,)

基类名

  ④__init__() 初始化方法

 class Foo():
def __init__(self):
print("创建类对象时执行初始化方法") f1 = Foo()#实例化类,也就是创建类对象 创建类对象时执行初始化方法

初始化方法

六、对象访问类中的变量的顺序 

  实例化的对象访问类中的变量时,先访问初始化方法init中的属性,如若没有就会访问init方法外的类里的,再没有就会报错

 class Foo(object):
a = 10
def __init__(self,a):
self.a = a f1 = Foo(2)
print(f1.a) 2

对象访问类中变量

 class Foo(object):
x = 10
def __init__(self,a):
self.a = a
def show_a(self):
print(self.a) f1 = Foo(2)
print(f1.x) 10

对象访问变量二

 class Foo(object):
x = 10
def __init__(self,a):
self.a = a
def show_a(self):
print(self.a) f1 = Foo(2)
print(f1.q) AttributeError: 'Foo' object has no attribute 'q'

变量不存在报错

七、实例化对象只会保存init方法中的变量,只含有数据属性,需要调用类的函数属性

八、类调用类方法需要指定self参数,参数任意

 class Foo():
def show(self):
print("show") #Foo.show(1)
#Foo.show(“sunqi”)
#Foo.show([1,2,3]) show

类调用类方法

九、实例增加方法时需要需要传self参数

 class Foo():
def __init__(self,a):
self.a = a
def show(self):
print("show") f1 = Foo("")
def hello(self):
print("hello") f1.fun = hello
f1.fun("sss")#必须指定self参数(可以是任意对象)
print(f1.__dict__) hello

实例增加方法

十、property 方法

  property方法会将类中的定义的方法变成变量,直接返回结果,隐藏逻辑

  加括号调用时会报错    

 class Foo():
def __init__(self,a,b):
self.a = a
self.b = b
# @property
def cal(self):
return self.a + self.b
f1 = Foo(1,2)
print(f1.cal) <bound method Foo.cal of <__main__.Foo object at 0x0000019C642E2128>>

未声明property

 class Foo():
def __init__(self,a,b):
self.a = a
self.b = b
@property
def cal(self):
return self.a + self.b
f1 = Foo(1,2)
print(f1.cal) 3

声明property

十一、类方法classmethod

 当我们想要用类调用类中定义的方法且不希望指定self对象是,我们就可以 采用classmethod声明一个类方法

 @classmethod
def tell_info(cls,[name,x]):可用更多参数
pass

类方法声明

 class Foo():
def func1(self):
print("类中的方法") @classmethod
def func3(cls,x):#类方法cls参数python自动指定类名,其他参数必须传值
print("cls--name",cls.__name__)
print("-->",x) f1 = Foo()
f1.func3(1)
print("*"*10)
Foo.func3(1)
print(f1.func3)
print(Foo.func3) cls--name Foo
--> 1
**********
cls--name Foo
--> 1
<bound method Foo.func3 of <class '__main__.Foo'>>
<bound method Foo.func3 of <class '__main__.Foo'>>

实例和类调用类方法

十二、静态方法staticmethod

  类中的没有修饰符,没有self,没有cls的普通方法实例是不能调用的,因为会默认给该方法穿第一个self参数,会报错

 class Foo():
def func():
print("func1")
f1 = Foo()
f1.func() 默认传参self
TypeError: func() takes 0 positional arguments but 1 was given

实例调用没有任何声明的方法

  那么我们如何用实例调用这种方法。这时候就需要用staticmethod声明一个普通方法

 class Foo():
@staticmethod
def func():
print("func1")
f1 = Foo()
f1.func() func1

staticmethod声明

十三、getattr,hasattr,setattr,delattr反射

 hasattr(b1,"name") 检测object中有没有一个name字符串对应的属性
getattr(b1,"name"),default 得到属性的值,设置default时 即使没有参数不会报错
setattr(b1,"name"," ")设置对象属性值,也可以添加函数属性 可以是匿名函数
delattr(b1,"name")删除对象的属性
 class B():
c = 1
def __init__(self,a,b):
self.a = a
self.b = b
def func(self):
print(self.a)
print(self.b) def fun():
print("fun") b1 = B(1,2)
# print(hasattr(b1,"func"))#判断对象是否有name属性
# print(getattr(b1,"func","not exist"))#存在就会返回该对象
# print(getattr(b1,"sun","not exist"))#不存在返回设置的默认值
# print(getattr(b1,"a"))#1
# print(setattr(b1,"func1",lambda x:x+1))
# print(setattr(b1,"func1",fun))#增加属性,函数和变量皆可 无返回值
# print(b1.__dict__)
# delattr(b1,"a")#删除属性
# print(b1.__dict__)
# print(hasattr(B,"a"))
# print(hasattr(B,"func"))
# getattr(B,"func")(b1)
# print(B.__dict__)
# print(getattr(B,"a"))#找不到实例变量
# delattr(B,"a")
# delattr(B,"c")#可以找到类变量
# print(getattr(B,"c","not exist"))

反射示例

十四、__setattr__(),__getattr__(),__delattr__()属性字典操作

 __setattr__()设置对象属性时会触发setattr,写入属性字典
__getattr__()调用一个对象不存在的属性时才会用
__delattr__()删除对象属性的时候会触发 三者都是直接操作属性字典
 class B():
def __init__(self,a,b):
self.a = a
self.b = b
def __setattr__(self, key, value):
self.__dict__[key] = value
# self.key = value
def __getattr__(self, item):
print("__getattr__")
return "not exist"
def __delattr__(self, item):
del self.__dict__[item]
def func(self):
print(self.a+self.b)
b1 = B(1,2) # print(b1.__dict__) # b1.__setattr__("sun","qi")#直接操作属性字典__dict__
# print(b1.__dict__)
# print(b1.a)#1
# print(b1.c)#调用不存在的变量时才会触发getattr方法 # print(b1.__dict__)#{'a': 1, 'b': 2}
# b1.__delattr__("a")
# print(b1.__dict__)#{''b': 2}

操作属性字典示例

十五、__getitem__(),__setitem__(),__delitem__()中括号调用属性时操作

 __xxxitem__:使用 [''] 的方式操作属性时被调用
__setitem__:每当属性被赋值的时候都会调用该方法,因此不能再该方法内赋值 self.name = value 会死循环
__getitem__:当访问不存在的属性时会调用该方法
__delitem__:当删除属性时调用该方法
 class B():
c = 1
def __init__(self,a,b):
self.a = a
self.b = b
def __getitem__(self, item):
print("get %s"%item)
return self.__dict__[item]
def __setitem__(self, key, value):
print("key %s value %s"%(key,value))
self.__dict__[key] = value
def __delitem__(self, key):
print("del %s"%key)
del self.__dict__[key] b1 = B(1,2)
def func():
print("func")
# print(b1["a"])#访问存在的变量时会调用getitem方法
# print(b1["d"])#访问不存在的变量时也会触发getitem方法
# b1["d"] = 3#设置属性时会触发setitem方法
# b1["func"] = func
# print(b1.__dict__)
# del b1["a"]
# print(b1.__dict__)#删除属性时会触发delitem方法

示例代码

Python开发第五篇的更多相关文章

  1. Python开发【第二篇】:初识Python

    Python开发[第二篇]:初识Python   Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...

  2. Python开发【第一篇】:目录

    本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! Python开发[第一篇]:目录 Python开发[第二篇]:初识Python ...

  3. Python开发【第一篇】:目录

    本系列博文包含Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习Python编程的朋友们提供一点帮助! .Python开发[第一篇]:目录 .Python开发[第二篇]:初始P ...

  4. Python开发【第一篇】基础题目二

    1 列表题 l1 = [11, 22, 33] l2 = [22, 33, 44] # a. 获取l1 中有,l2中没有的元素 for i in l1: if i not in l2: # b. 获取 ...

  5. Python开发【第一篇】:初识Python

    初识python 一.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...

  6. 跟着老男孩教育学Python开发【第一篇】:初识Python

    Python简介 Python前世今生 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...

  7. Python开发【第一篇】Python基础之装饰器

    写代码要遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已实现的功能代码块开放:对扩展开发 #s2 ...

  8. Python开发【第二篇】:初始Python

    Python的前世今生 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,中国人称他为龟叔,他在圣诞节期间在阿姆斯特丹为了打发时间,决定开发一个新的脚本 ...

  9. Python开发【第二篇】:Python基础知识

    Python基础知识 一.初识基本数据类型 类型: int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位 ...

随机推荐

  1. Go语言基础之12--Channel

    一.不同goroutine之间如何进行通讯? 1.全局变量和锁同步 缺点:多个goroutine要通信时,定义太多的全局变量(每个全局变量功能不一样),不好维护 2.Channel 二.channel ...

  2. esper(1)-窗口概述

    Time Window: Length Window: Time Batch Window: 带batch的是所有的都执行完后,在触发UpdateListener,如下边例子: public clas ...

  3. Thread.GetNamedDataSlot(String)

    https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.thread.getnameddataslot?redirectedfrom= ...

  4. mgo01_window server 2012上安装mongo4.0

    目前mongo最新版为4.0(2018-07-18),下载地址 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-4 ...

  5. 配置MapReduce程序运行环境

    已安装eclipse,hadoop 查看教程dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/

  6. 转 oracle 默认自动统计信息 时间修改

    ############sql3: https://blog.csdn.net/dataminer_2007/article/details/41363417http://blog.51cto.com ...

  7. JavaSE---多线程---线程的生命周期

    1.线程的生命周期:新建.就绪.运行.阻塞.死亡 2.运行状态线程进入阻塞: 1.1 调用sleep方法主动放弃: 1.2 调用线程的suspend方法将线程挂起,不推荐使用: 1.3 线程调用一个阻 ...

  8. CentOS 7 修改root 密码

    环境: 1.重启系统在加载内核的地方按e,编辑启动脚本 2.将ro crashkernel = auto 所在地的 ro 替换为 rw init=/sysroot/bin/sh 3.修改完成后用Ctr ...

  9. CBoard数据分析实战

    介绍 CBoard由上海楚果信息技术有限公司主导开源, 它不仅仅是一款自助BI数据分析产品, 还是开放的BI产品开发平台: 用户只需简单妥妥拽拽就能自助完成数据多维分析与报表设计 开发者能够简单扩展连 ...

  10. 【ubuntu】安装输入法

    1.安装系统自带的输入法 出现问题1:Requires installation of untrusted packages 输入代码更新组件 sudo apt-get update &&am ...