Python全栈开发之面向对象

No.1 概念

面向对象的特点?

注重对象和指责,不同的对象承担各自的指责

更加适合对复杂的需求变化,专门应对复杂项目开发,提供固定的套路

面向对象强调的是谁来做,面向过程强调的如何做

什么是类

类是对一群具有相同特征或者行为的事物统称,是抽象的,不能直接使用,特征被称为属性,行为被称为方法,类就是一个模板

什么是对象

对象是由类创建出来的一个具体存在,可以直接使用,通过哪个类创建出来的实例,就拥有哪个类中定义的特征和行为

类和对象的关系

类是模板,对象是根据类这个模板创建出来的,先有类,再有对象

类只有一个,对象有多个

类中定义的方法属性都会存在对象中,不多不少

不同的对象之间的属性不尽相同

No.2 类的创建

方法名 类型 作用
new 方法 通过类()创建对象时,向内存申请空间,并将对象引用传递给init
init 方法 对象初始化时,会调用此方法
del 方法 对象被销毁时,会调用此方法
str 方法 返回对象的描述信息
class Cat:
    """这是一个猫类"""

    def eat(self):
        print("小猫爱吃鱼")

    def drink(self):
        print("小猫在喝水")

tom = Cat()
tom.drink()
tom.eat()

对象中的self参数

在类封装的方法内部,self就表示当前调用方法的对象自己
调用方法时,不需要传递self参数
在方法内部可以通过self.访问对象的属性
也可以通过self.调用其他的对象方法
class Cat:
    def __init(self,name)
        self.name = name

    def eat(self):
        print("%s 爱吃鱼" % self.name)

tom = Cat(‘mimimi‘)
tom.eat()

No.3 封装

封装是面向对象编程的一大特点

面向对象将属性和方法封装到一个抽象的类中

外部使用类创建对象,然后让对象调用方法

对象方法的细节都被定义到类的内部

No.4 继承

DFS(深度优先算法):

class E:
    def say(self):
        print(‘E‘)
class D:
    pass
class C(E):
    pass
class B(D):
    pass
class A(B,C):
    pass
a = A()
a.say()
# 查找顺序 A->B->D->C->E

BFS(广度优先算法):

class E:
    def say(self):
        print(‘E‘)
class D:
    pass
class C(E):
    pass
class B(D):
    pass
class A(B,C):
    pass
a = A()
a.say()
# 查找顺序 A->B->C->D->E

C3(算法):

class F:
    def say(self):
        print(‘F‘)
class E(F):
    pass
class D(F):
    pass
class C(E):
    pass
class B(D):
    pass
class A(B,C):
    pass
a = A()
a.say()
print(A.__mro__) # (<class ‘__main__.A‘>, <class ‘__main__.B‘>, <class ‘__main__.D‘>, <class ‘__main__.C‘>, <class ‘__main__.E‘>, <class ‘__main__.F‘>, <class ‘object‘>)
# 查找顺序 A->B-?>D-C->E-F

No.5 多态

Python中不支持多态,也不用支持多态,Python是一种多态语言,崇尚鸭子类型,鸭子类型的概念来自于:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子,Python不会检查类型是不是鸭子,只要它拥有鸭子的特征,就可以被正确的调用

class Duck:
    def speak(self):
        print(‘嘎嘎嘎...‘)
class Dog:
    def speak(self):
        print(‘汪汪汪...‘)
class Cat:
    def speak(self):
        print(‘喵喵喵...‘)
animal = []
animal.append(Duck)
animal.append(Dog)
animal.append(Cat)
for i in animal:
    i().speak()
# 嘎嘎嘎...
# 汪汪汪...
# 喵喵喵...

No.6 类方法、静态方法、实例方法

实例方法第一个参数必须是self,通过实例方法来传递实例的属性和方法,只能同实例来调用,静态方法使@staticmethod装饰器来定义,参数随意,静态方法是一个独立的函数,它仅仅依托于类的命名空间,不会涉及到类是属性和方法的作,静态方法因为没有参数绑定到该类所以仅仅提供函数功能,不能调用实例属性或静态属性,类方法使用@classsmethod来定义,第一个参数必须是cls,通过它传递类的属性和方法,类方法只能调用静态属性

class Data():
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day
    @staticmethod
    def static_method(date_str):
        year,month,day = tuple(date_str.split(‘-‘))
        return Data(int(year),int(month),int(day))
    @classmethod
    def class_method(cls,date_str):
        year, month, day = tuple(date_str.split(‘-‘))
        return cls(int(year), int(month), int(day))
    def object_method(self):
        print(self.year,self.month,self.day,sep=‘-‘)
if __name__ == ‘__main__‘:
    date = Data(2018,9,15)
    date.object_method() # 2018-9-15
    date = Data.class_method(‘2018-9-16‘)
    date.object_method() # 2018-9-16
    date = Data.static_method("2018-9-17")
    date.object_method() # 2018-9-17

No.7 类变量和实例变量

类变量,可以通过类调用,也可以通过实例调用,在内存中之存在一份

实例变量,只能通过实例调用,每个对象都有一份

class Person:
    country = "中国"
    def __init__(self,name,age):
        self.name = name
        self.age = age

p1 = Person(‘kernel‘,18)
print(p1.name) # kernel
print(p1.age) # 18
print(p1.country) # 中国
print(Person.country) # 中国
p1.country = "美国" # 当通过对象修改类变量时,将会在该对象创建一个和类变量同名的变量,类变量依然不变
print(p1.country) # 美国
print(Person.country) # 中国
p2 = Person(‘alex‘,38)
print(p2.name) # alex
print(p2.age) # 38
print(p2.country) # 中国

No.8 私有属性和数据封装

class User:
    def __init__(self,name,age):
        self.name = name
        self.__age = age
    def get_age(self):
        print(self.__age)
    def set_age(self,age):
        self.__age = age
if __name__ == ‘__main__‘:
    u = User(‘kernel‘,18)
    # print(u.__age) # AttributeError: ‘User‘ object has no attribute ‘__age‘ 好吧,私有属性不让我访问,但是真的无法访问吗
    print(u._User__age) # 但这又是什么鬼呢?当然我们不建议这么干
    u.set_age(19)
    u._User__age=20 # 当然,设置也可以这样
    u.get_age() # 20

No.9 单例模式

new方法

使用类名()创建对象,首先会调用new方法为对象分配空间,它的主要作用就是在内存中为对象分配空间和返回对象的引用,Python解释器得到对象的引用后,将引用传递给init

让类创建的对象,在系统中只有唯一的一个实例

定义一个类属性,初始值是None,用于记录单例对象的引用

重写new方法

如果类属性是None,调用方法申请空间,并在类属性中记录

返回类属性中纪录的对象引用

class MusicPlayer(object):
    instance = None # 记录第一个被创建对象的引用
    init_flag = False # 记录是否执行过初始化动作

    def __new__(cls, *args, **kwargs):
        if cls.instance is None:#  判断类属性是否是空对象
            cls.instance = super().__new__(cls)  #  调用父类的方法,为第一个对象分配空间
        return cls.instance # 返回类属性保存的对象引用

    def __init__(self):
        if not MusicPlayer.init_flag:
            MusicPlayer.init_flag = True

player1 = MusicPlayer() # <__main__.MusicPlayer object at 0x0000017C297F99E8>
print(player1)
player2 = MusicPlayer() # <__main__.MusicPlayer object at 0x0000017C297F99E8>
print(player2)

原文地址:http://blog.51cto.com/13559120/2287760

时间: 2024-10-31 06:58:16

Python全栈开发之面向对象的相关文章

python全栈开发 * 23 面向对象 知识点汇总 * 180704

23 面向对象 -----特殊方法 1. isinstance(obj,类名) 判断对象是否是此类实例化或者此类的子类实例化出来的class A:passclass B(A):passb1=B()print(isinstance(b1,B)) # Trueprint(isinstance(b1,A)) # True2.issubclass(类名,类名1) 判断类名是否是类名1的子类class A:passclass B(A):passprint(issubclass(B,A)) #Truepri

python全栈开发 * 18 面向对象知识点汇总 * 180530

18 面向对象初识1class person: level="高级动物" mind="有思想" def __init__(self,name,age,gent,area,hobby): self.name=name self.age=age self.gent=gent self.area=area self.hobby=hobby print("__init__") pass def walk(self): pass def eat(self)

Python 全栈开发【第一篇】:目录

Python 全栈开发[第0篇]:目录 第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基础语法入门 Python 全栈开发[第三篇]:数据类型.字符编码.文件操作 第二阶段:函数编程&常用标准库 Python 全栈开发[第四篇]:函数.递归.生成器.迭代器 Pyhton 全栈开发[第五篇]:常用模块学习 第三阶段:面向对象编程&网络编程基础 Python 全栈开发[第六篇]:面向对象

python全栈开发学习目录

python全栈开发学习目录 第一章 计算机基础 第二章Python入门 第三章数据类型 第四章文件操作 第五章函数 第六章 模块 第七章 面向对象 第八章 网络编程 第九章 并发编程 第十章 数据库 第十一章 前端开发-html 第十一章 前端开发-css 附加:js特效 15个小demo 第十一章 前端开发-JavaScript 第十一章 前端开发-jQuery 第十一章 前端开发-bootstrap 第十二章 Django框架开发 ... 原文地址:https://www.cnblogs.

Python全栈开发【基础三】

Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 1 def 函数名(参数): 2 3 ... 4 函数体 5 ... 6 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行一系列的逻辑计算 参数:为函数体提供数据 返回值:当函数执行完毕后,可以给调用者返回数据. 总结使用函数的好处: 1.减少代码重用 2.保持一致性,易维护

Python全栈开发【第一篇】:初识Python

Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与while循环练习题 基本数据类型前引 Python 的种类 Cpython Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上. Jyhton Python的Java实现,Jython会将Pyth

Python全栈开发

Python全栈开发 一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大,但是理解起来有些困难,因此我尽量用最简单的例子一步步的说明这个原理. 1.不带参数的装饰器 假设我定义了一个函数f,想要在不改变原来函数定义的情况下,在函数运行前打印出start,函数运行后打印出end,要实现这样一个功能该怎么实现?看下面如何用

Python全栈开发【基础二】

Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 1 class int(object): 2 """ 3 int(x=0) -> integer 4 int(x, base=10) -&g

python全栈开发目录

python全栈开发目录 linux命令 初识python python基础数据类型 函数编程.set.深浅拷贝 内置函数 文件操作 装饰器 迭代器和生成器 常用模块 初识类和对象 类和对象(进阶) 反射 异常处理 socket.IO多路复用 线程.进程.协程 HTML CSS JavaScript DOM文档操作 jQuery实例 web框架本质 Tornado mysql基础 mysql进阶 ..... 基本算法 递归--二分法查找 冒泡排序 更多 线程池