python: 函数式 + 面向对象

函数式可以做所有的事,是否合适?

面向对象:

一、定义:

  1. 函数: def + 函数名(参数)

    面向对象: class  -》 名字叫 Bar 类

    def  -> 名字叫 foo 的方法。第一个参数是 self

  2. class Bar():
    def __init__(self, name, age):
    '''
    构造方法,构造方法的特性,类名()自动执行构造方法
    '''
    # 字段
    self.name = name
    self.age = age
    print('') def foo(self):
    print('foo')
    print(self.name)
    print(self.age) obj = Bar('lily', 18)
    obj.foo()

二、执行:

  1. 函数:函数名(参数)

    面向对象: obj = Bar()# 创建中间人,对象

    obj.foo()

    # self:代指调用方法的对象(中间人)

    中间人里面可以存值:obj.name = ‘lily’

          self 永远指调用此方法的调用者

    封装:将属性封装到对象里

    # 构造方法:

    特殊作用:

    obj = 类名():完成两件事(1. 创建对象 2. 通过对象执行类中的一个特殊方法 __init__)

小结1:

创建类: class 类名

创建方法:   构造方法: __init__  创建对象时自动调用此构建方法

普通方法:先创建对象,然后用对象调用普通方法

面向对象三大特性之一:封装

class Bar():
    def __init__(self, name, age):
'''
        构造方法,构造方法的特性,类名()自动执行构造方法
        '''
        self.name = name
        self.age = age
        print('123')

obj = Bar('lily', 18)

适用场景:如果多个函数中有一些相同参数时,转换成面向对象

面向对象三大特性之二:继承

重写:防止执行父类中的方法

主动调用父类方法有两种方式: super(son, self).football() 和 father.football(self)

推荐使用 super 方法

python中支持多继承: a. 左侧优先  b. 一条道走到黑  c. 同一个根时,根最后执行

# ---------------继承-----------------------
class father: # 父类,基类
def basketball(self):
print('father.basketball')
def football(self):
print('father.football') class father1: # 父类,基类
def basketball(self):
print('father1.basketball') class son(father, father1): # 子类、派生类
gender = 'male' def cooking(self):
print('cooking') # 重写
def football(self):
# # super 可以实现执行父类中的方法,传的参数: 子类名, self, 以及调用的父类方法
# super(son, self).football()
# 方法2:实现调用父类中的方法,传入参数:self
father.football(self)
print('son.football') s = son()
s.cooking()
s.basketball()
# s.football()

面向对象三大特性之三:多态(python原生多态)

面向对象中高级:

成员:

字段:普通字段(保存在对象中)、 静态字段

普通字段属于对象,保存在对象中,只能通过对象访问;

静态字段属于类,内存中只保存一份,执行时可以通过对象访问,也可以通过类访问

方法:- 普通方法:保存在类中,由对象来调用   self  - >  调用对象

- 静态方法:@staticmethod; self 不是必须的;保存在类中,通过类直接调用

- 类方法: @classmethod ;保存在类中,由类直接调用; cls -> 当前类

应用场景:

如果对象中需要保存一些值,执行某功能时,需要使用对象中的值  -》 普通方法

不需要任何对象中的值 -》 用静态方法

属性:定义像方法,调用像字段

class Foo:
name = 'foo' def __init__(self):
print('init') def bar(self):
print('bar') @staticmethod
def static_bar():
print('static bar') @classmethod
def cls_bar(cls):
print('class_bar') # 用于执行 obj.per
@property
def per(self):
print('per')
return 1 # 用于执行 obj.per = 123,此处内部实现并没有实现赋值功能,而是实现了一个打印的功能。 当 执行此赋值语句时就会执行此方法
@per.setter
def per(self, val):
print(val) @per.deleter
def per(self):
print('del') obj = Foo()
print(obj.name) # foo
obj.bar() # bar
Foo.static_bar() # static bar
Foo.cls_bar() # class_bar r = obj.per # per
print(r) # obj.per = 123
del obj.per

一、成员修饰符:

公有成员:

私有成员:__字段名,无法直接访问,只能间接访问

二、特殊成员(参考博客:http://www.cnblogs.com/duanv/p/5947525.html)

__init__

__call__

__int__

__str__

__add__

__dict__:打印出对象的属性。(如果是类的属性,且对象没有对该属性进行单独更改,那么就不会保存在对象中,要使用的时候会去上一级找)

__getitem__(self, item):    # 切片或索引

__setitem__(self, key, value): 相当于中括号赋值

__delitem__(self, key): 删除 del list[100]

__iter__:

class Foo:

    __v = ''

    def __init__(self, name, age):
self.name = name
# self.age = age
self.__age = age # 私有对象,外部无法直接访问 def __call__(self, *args, **kwargs):
print('call') def __int__(self):
return 1 def __iter__(self):
# 如果类中有 __iter__方法,对象 -》 可迭代对象
# 对象, __iter__()的返回值,迭代器
# for 循环: 迭代器, next
# for 循环: 可迭代对象,对象 __iter__(),迭代器,next
return iter([11, 22, 33, 44])
# return [11, 22, 33, 44] def show(self):
return self.__age @staticmethod
def stat():
return Foo.__v @staticmethod
def __f1():
return 111 def f2(self):
r = self.__f1()
return r obj = Foo('lily', 18)
print(obj.name) # lily
# print(obj.age)
r1 = obj.show()
print(r1) #
r2 = Foo.stat()
print(r2) # r3 = obj.f2()
print(r3) # # 相当于 Foo()(),对象后面加()会调用 call()方法
obj() # call # int(对象),自动执行对象的 __int__方法,并将返回值赋给int对象
r4 = int(obj)
print(r4) # d = obj.__dict__
print(d) li = Foo('su', 18)
# 执行 li 对象的类Foo类中的 __iter__方法,并获取其返回值
# 循环上一步返回的对象
for i in li:
print(i)

三、metaclass:类的祖宗

  1. python中一切事物都是对象
  2. class  Foo:

pass

obj = Foo()

# obj是 Foo的对象

# Foo 类是一个对象,type的对象,type 是 metaclass

类都是 type 类的对象

class Mytype(type):
def __init__(self, *args, **kwargs):
print('mytype')
pass def __call__(self, *args, **kwargs):
obj = self.__new__(self, *args, **kwargs) self.__init__(obj) class Myfoo(object, metaclass=Mytype):
def __init__(self):
pass def __new__(cls, *args, **kwargs):
return object.__new__(cls, *args, **kwargs) def myfunc(self):
print('hello')
obj_of_foo = Myfoo()

#####
首先会创建一个 Myfoo 类对象,会去调用 Mytype 中的 __init__ 方法。
接下来,Myfoo()会去调用 Mytype 中的 __call__方法,执行里面的内容:1. 调用 self,也就是 Myfoo 的 __new__ 方法,生成了一个 Myfoo 类的对象返回赋值给 obj。
2. 调用 Myfoo 里面的 __init__ 方法,并传入 obj 对象,初始化完成。

四、异常处理

# Exception

# 主动抛出异常

# 断言:强制用户服从,不服从报错。可捕获异常,但一般不捕获。

assert + 条件,如果不满足直接报错

五、反射

getattr

setattr

delattr

# _author: lily
# _date: 2019/1/21 class Foo:
def __init__(self, name, age):
self.name = name
self.age = age obj = Foo('lily', 18)
obj1 = Foo('su', 18)
b = 'name'
print(obj.__dict__[b]) # 去什么东西里面获取什么内容
v = getattr(obj, 'name')
print('v = ', v) # func = getattr(Foo, 'show') # 找到 show 函数
# print(func()) # hasattr(obj, 'name') # 判断有无某种属性
# setattr(obj, 'k1', 'v1') # 设置属性
# print(obj.k1) # v1 delattr(obj, 'name')
# print(obj.name) # 会报错
print(obj1.name) # su

六、单例模式

好处:省内存,对象之创建一份

应用:数据库连接

__init__   __call__   __new__:

init 方法是将 对象 初始化的时候调用(比如说: 解释器遇到一个类的定义时,会调用 type 的 init 方法)

call 方法是 对象 被调用的时候调用(比如说:解释器遇到 Foo()、obj() 的时候会调用 call 方法)。

如:1.  Foo 类被调用,会去执行 type的call 方法,在 call 方法的实现里,去调用self.new 和 slef.init,此处self 指的是对象Foo。

2. self.new 去实现Foo里面的 new方法(Foo里面的new 默认去调用object的new方法),并返回一个对象。

3. self.init(obj)去实现Foo里面的init 方法,将对象进行初始化。

new 方法才是真正创建一个对象

# _author: lily
# _date: 2019/1/21 # 单例模式,永远使用同一份实例(对象) class Foo:
__instance = None def __init__(self, name, age):
self.name = name
self.age = age @classmethod
def get_instance(cls, name, age):
print(cls)
if cls.__instance:
return cls.__instance
else:
cls.__instance = Foo(name, age)
return cls.__instance obj1 = Foo.get_instance('lily', 18)
print(obj1)
del obj1
#
# obj2 = Foo.get_instance('su', 18)
# print(obj2)
# print(obj2.name)

22 python 初学(类,面向对象)的更多相关文章

  1. 22.python中的面向对象和类的基本语法

    当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀.我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容.这个 ...

  2. 从C#到Python —— 4 类及面向对象

    http://www.cnblogs.com/yanxy/archive/2010/04/04/c2p_4.html 如果你熟悉C#,那么对类(Class)和面向对象(Object Oriented) ...

  3. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  4. python进阶01 面向对象、类、实例、属性封装、实例方法

    python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...

  5. python3 速查参考- python基础 8 -> 面向对象基础:类的创建与基础使用,类属性,property、类方法、静态方法、常用知识点概念(封装、继承等等见下一章)

    基础概念 1.速查笔记: #-- 最普通的类 class C1(C2, C3): spam = 42 # 数据属性 def __init__(self, name): # 函数属性:构造函数 self ...

  6. 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)

    面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...

  7. Python如何设计面向对象的类(上)

    Python是一门高级语言,支持面向对象设计,如何设计一个符合Python风格的面向对象的类,是一个比较复杂的问题,本文提供一个参考,表达一种思路,探究一层原理. 目标 期望实现的类具有以下基本行为: ...

  8. Python如何设计面向对象的类(下)

    本文将在上篇文章二维向量Vector2d类的基础上,定义表示多维向量的Vector类. 第1版:兼容Vector2d类 代码如下: from array import array import rep ...

  9. Python学习之路——类-面向对象编程

    类 面向对象编程 通过类获取一个对象的过程 - 实例化 类名()会自动调用类中的__init__方法 类和对象之间的关系? 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值 ...

随机推荐

  1. 聚类——FCM

    聚类——认识FCM算法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.FCM概述 FCM算法是基于对目标函数的优化基础上的一种数据聚类方法.聚类结 ...

  2. log4j2.yml配置文件

    # https://blog.csdn.net/u010598111/article/details/80556437 # 共有8个级别,按照从低到高为:ALL < TRACE < DEB ...

  3. 【c#】RabbitMQ学习文档(一)Hello World

    一.简介 RabbitMQ是一个消息的代理器,用于接收和发送消息,你可以这样想,他就是一个邮局,当您把需要寄送的邮件投递到邮筒之时,你可以确定的是邮递员先生肯定会把邮件发送到需要接收邮件的人的手里,不 ...

  4. 在数据采集器中用TensorFlow进行实时机器学习

    最新DataOps平台的真正价值,只有在业务用户和应用程序能够从各种数据源来访问原始数据和聚合数据,并且及时地产生数据驱动的认识时,才能够实现.利用机器学习(Machine Learning),分析师 ...

  5. 微服务实战(二):使用API Gateway

    微服务实战(一):微服务架构的优势与不足 微服务实战(二):使用API Gateway 微服务实战(三):深入微服务架构的进程间通信 微服务实战(四):服务发现的可行方案以及实践案例 微服务实践(五) ...

  6. 第一册:lesson 101。

    原文: A card from Jimmy Read Jimmy's card to me please,Penny. I have just arrive in Scotland and I'm s ...

  7. MVC架构中的Repository模式 个人理解

    关于MVC架构中的Repository模式   个人理解:Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接 ...

  8. Java与.net的选择和比较

    跨平台对开发商是一个巨大的诱惑.一次开发,多个平台使用,降低了迁移成本,有利.但Java的开发工具没有.net顺手,对编码人员的要求比.net要高. .net培训成本低,上手快.尤其如果开发人员以前都 ...

  9. asp.net 建多个项目实现三层的实例——读取一张表中的记录条数

    学习asp.net两周,通过学习发现,.net和php之间的区别还是蛮大的,比php要复杂一些,开始学习的有些吃力,后来跟着传智播客里的老师学习,渐渐的学到了一些东西. 今天要记录一下.net里的简单 ...

  10. Sublime Text 快捷键列表

    Sublime Text 快捷键列表 快捷键按类型分列如下: 补充:1.快速的创建一个html页 :ctrl+n创建一个新的文件-->右下角选择文件类型-->输入英文"!&quo ...