循序渐进Python3(六) -- 面向对象

Python 面向对象

什么是面向对象编程?

面向对象编程是一种程序设计范式

对现实世界建立对象模型

把程序看作不同对象的相互调用

Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。下面我们将详细介绍Python的面向对象编程。

如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。

接下来我们先来简单的了解下面向对象的一些基本特征。

面向对象技术简介

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

    定义类并创建实例
    
    在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类如下:
    
    class Person():
        pass
    
    按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。类的继承将在后面的章节讲解,现在我们只需要简单地从object类继承。
    
    有了Person类的定义,就可以创建出具体的xiaoming、xiaohong等实例。创建实例使用 类名+(),类似函数调用的形式创建:
    
    xiaoming = Person()
    xiaohong = Person()
    

    注:python 2 创建类与python 3 不同

py 2.2 后继承 object 的目的是使这个类成为 new style class,
没有继承 object 的为传统 classic class,
在py 2.7.11进行了测试 

>>> class A(object):
...     pass
...
>>> print(type(A))
<type ‘type‘>
>>> class B():
...  pass
...
>>> print(type(B))
<type ‘classobj‘>
# 可见2个type是不同的

>>> print dir(A)
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]
>>> print dir(B)
[‘__doc__‘, ‘__module__‘]
# 属性也是不一样的

而py 3.5.2:
class A(object):
    pass
print(type(A))
print(dir(A))

class B():
    pass
print(type(B))
print(dir(B))

<class ‘type‘>
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__le__‘, ‘__lt__‘, ‘__module__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]
<class ‘type‘>
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__le__‘, ‘__lt__‘, ‘__module__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]

说明 py 3.5   object 已经作为默认基类被继承了(跟 java 一样).
  • 字段字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同。普通字段属于对象,静态字段属于.

    class Province:
        # 静态字段
        country = ‘中国‘
        def __init__(self, name):
            # 普通字段
            self.name = name
    # 直接访问普通字段
    obj = Province(‘河北省‘)
    print(obj.name)
    # 直接访问静态字段
    print(Province.country)
    

    静态字段在内存中只保存一份,普通字段在每个对象中都要保存一份

  • 方法方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

  普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
          类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
          静态方法:由类调用;无默认参数;

#!/usr/bin/env python
# Version = 3.5.2
# __auth__ = ‘无名小妖‘

class Foo:

    def __init__(self, name):
        self.name = name

    def ord_func(self):
        """ 定义普通方法,至少有一个self参数 """
        print(‘普通方法‘)

    @classmethod
    def class_func(cls):
        """ 定义类方法,至少有一个cls参数 """
        print(‘类方法‘)

    @staticmethod
    def static_func():
        """ 定义静态方法 ,无默认参数"""
        print(‘静态方法‘)

# 调用普通方法
f = Foo(‘那么‘)
f.ord_func()

# 调用类方法
Foo.class_func()

# 调用静态方法
Foo.static_func()

尽量不要用对象执行静态方法和类方法。

   属性:Python中的属性其实是普通方法的变种。

class Foo:
    def func(self):
        pass
    # 定义属性
    @property
    def prop(self):
        print(‘xxx‘)
# ############### 调用 ###############
foo_obj = Foo()

foo_obj.func()
foo_obj.prop   #调用属性

由属性的定义和调用要注意一下几点:

    • 定义时,在普通方法的基础上添加 @property 装饰器;
    • 定义时,属性仅有一个self参数
    • 调用时,无需括号
                 方法:foo_obj.func()
                 属性:foo_obj.prop

注意:属性存在意义是:访问属性时可以制造出和访问字段完全相同的假象。

属性的定义有两种方式:

  • 装饰器 即:在方法上应用装饰器
  • 静态字段 即:在类中定义值为property对象的静态字段

装饰器方式:在类的普通方法上应用@property装饰器

#!/usr/bin/env python
# Version = 3.5.2
# __auth__ = ‘无名小妖‘

class Pager():

    def __init__(self,all_count):
        self.all_count = all_count
    @property
    def all_pager(self):
        a1,a2 = divmod(self.all_count,10)
        if a2 == 0:
            x = a1
        else:
            x = a1 + 1
        return x

    @all_pager.setter
    def all_pager(self,value):
        self.all_count = value * 10

    @all_pager.deleter
    def all_pager(self):
        print(‘deleter‘)

p = Pager(101)
print(p.all_pager)
p.all_pager = 123
print(p.all_pager)
del p.all_pager

输出结果:

11
123
deleter

静态字段方式,创建值为property对象的静态字段

  • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
  • 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
  • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
class Foo:

    def get_bar(self):
        return ‘xiaoyao1‘

    # *必须两个参数
    def set_bar(self, value):
        print(‘set value is ‘ + value)

    def del_bar(self):
        print(‘xiaoyao2‘)

    BAR = property(fget=get_bar, fset=set_bar, fdel=del_bar)

obj = Foo()

obj.BAR              # 自动调用第一个参数中定义的方法:get_bar
x = obj.BAR
print(x)
obj.BAR = "alex"     # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入
del obj.BAR          # 自动调用第三个参数中定义的方法:del_bar方法

xiaoyao1
set value is alex
xiaoyao2
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是 模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 方法:类中定义的函数。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
时间: 2024-10-07 22:46:15

循序渐进Python3(六) -- 面向对象的相关文章

循序渐进地培养面向对象的思维方式

在我踏入软件行业后,一直苦于没有前辈指点.我常年困惑于两个问题:一是怎样培养面向对象设计的思维能力?二是怎样进行架构设计,有无方法? 因为我做了那么多年项目,却很少看到有漂亮的面向对象思维写出来的代码,觉得有必要提醒下年轻从业者.如今总结一下自己的经历,希望对刚刚入行的朋友有些启发吧. 我的基本观念是,面向对象的思维方式是可以循序渐进地培养出来的.通俗地讲,就是不断地编码实践,量变会引起质变. 1 开发人员的思考动力不足 记得参加工作后做的第一个项目是某电信局的运营支撑系统开发,采用的开发框架是

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: ? ? ? ? ? ?将一些东西封装到一个地方,你还可以取出来 ? ? ? ? ? ?类设置静态属性, 设置一些方法 或者 对象, 对象可以在其对象封装一些属性 多态: ? ? ? ? ? ?python默认支持多态, 多态指的是一种事务具有多种形态 ? ? ? ? ? ?1.多态可以增加代码的灵活度: ? ? ? ? ? ?2.以继承和重写父类方法为前提: ?

【Python3之面向对象的程序设计】

一.面向对象的程序设计的由来 1.第一阶段:面向机器,1940年以前 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数据. 简单来说,就是直接编写 0 和 1 的序列来代表程序语言.例如:使用 0000 代表 加载(LOAD),0001 代表 存储(STORE)等. 优点:机器语言由机器直接执行,速度快: 缺点:写比较困难,修改也麻烦,这样直接导致程序编写效率十分低下,编写程序花费的时间往往是实际运行时间的几十倍或几百倍. 由于机器语言实在是太难编写了,

六 面向对象高级属性

一 isinstance(obj,cls)和issubclass(sub,super) 二 反射 三 __setattr__,__delattr__,__getattr__ 四 二次加工标准类型(包装) 五 __getattribute__ 六 描述符(__get__,__set__,__delete__) 六 再看property 七 __setitem__,__getitem,__delitem__ 八 __str__,__repr__,__format__ 九 __slots__ 十 __

循序渐进Python3(十一) --2-- web之javascript

JavaScrip JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之后,浏览器可以解释并做出相应的处理. 一.如何编写 1.JavaScript代码存在形式 <!-- 方式一 --> <script type="text/javascript" src="JS文件"></script> <!-- 方式二 --> <sc

【Python3之面向对象进阶】

一.isinstance和issubclass 1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj=Foo() print(isinstance(obj, Foo)) 输出 True 2.issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object): pass class Bar(Foo): pass print(issubclass(Bar, Fo

循序渐进Python3(十一) --4-- ?web之jQuery

jQuery jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是"write Less,Do More",即倡导写更少的代码,做更多的事情.它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动画设计和Ajax交互. jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口:具有

&lt;六&gt;面向对象分析之UML核心元素之业务实体

一:基本概念          ---->业务实体类(class)的一种版型.特别用于在业务建模阶段建立领域模型.业务实体是业务模型中非常重要的一个因素,它为问题领域中的关键概念建立概念化的理解.是人们认识问题领域的重要手段.如果说参与者和用例描述了我们在这个问题领域中达到的什么样的目标,那么业务实体就描述了我们使用什么来达到业务目标以及通过什么记录这个业务目标.        ---->官方定义:业务实体代表业务角色执行业务用例处理或使用的“事物”.        ---->一个业务实

循序渐进Python3(八) -- 初识socket

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作. socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: file模块是针对