> 技术文档 > 小杰python(seven day finally)——历经千帆,归来仍是少年。

小杰python(seven day finally)——历经千帆,归来仍是少年。


1.python语言—解释型语言

语言发展:

机器语言(0,1)---汇编语言---高级语言(C 面向过程)---面向对象(python)

(1).面向过程

分析解决问题的步骤,然后逐步实现

小白电脑

        网上查资料

        根据自己预算需求电脑型号 华硕天选

        去线下门店实地考察

        找业务员砍价赠品 付款

(2).面向对象

找出问题,把任务分配出去,交给别人完成,我只求最终结果

小白电脑

        找一个靠谱电脑高手

        给钱交易

2.面向对象的技术点

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 方法:类中定义的函数
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
  • 实例化:创建一个类的实例,类的具体对象。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法

和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。

(1)类的使用

        类的创建

格式:

class 类名:

        def__init__(self,属性种类):

                内容

        def 行为函数名(self):

                内容

demo:

class Car: \"\"\" 记录一些好看的车 \"\"\" num = 0 def __init__(self, color, price): self.color = color self.price = price Car.num += 1

num变量是一个变量他的值会在类的所有之间共享

self:是一个参数表示实例化对象,存储的是地址

Car.num访问__init__函数也叫类的构造函数

        访问方法

用内置函数调用的方式(.)

demo:

class Car: \"\"\" 记录一些好看的车 \"\"\" num = 0 def __init__(self, color, price): self.color = color self.price = price def jie(self): print(f\'{self.color}型很漂亮,售价{self.price}万元\')# 创建了Car类的第一个对象xmi = Car(\"gray\", 21)xmi.jie()# 输出:gray型很漂亮,售价21万元

        类属性的增删改

1.直接赋值增改

2.内置函数增删改

hasattr:判断属性是否存在

getattr: 获取属性值

setattr: 修改属性值;如果属性不存在,会创建新属性

delattr:删除属性

# 创建了Car类的第一个对象xmi = Car(\"gray\", 21)# 调用类中的方法xmi.its()# 添加typ属性xmi.typ = \'SUV\'# 修改colors属性xmi.color = \'green\'# 删除price属性del xmi.price# hasattr:判断属性是否存在# print(hasattr(xmi, \"typ\"))# getattr: 获取属性值# print(getattr(xmi, \"color\"))# setattr: 修改属性值;如果属性不存在,会创建新属性setattr(xmi, \"color\", \"yellow\")print(getattr(xmi, \"color\"))setattr(xmi, \"co\", \"yel\")# delattr:删除属性delattr(xmi, \"co\")print(getattr(xmi, \"co\"))

(2)python内置类属性

python 3.n,所有都有一个共同父类object(顶级父类)

        内置类属性
  • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
  • __doc__ :类的文档字符串()
  • __name__: 类名
  • __module__: 类定义所在的模块(类的全名是\'__main__.className\',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
  • __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组
print(\"类名:\", Dog.__name__)print(\"类的文档字符串\", Dog.__doc__)print(\"类定义所在的模块\", Dog.__module__)print(\"类的所有父类构成元素\", Dog.__bases__)print(\"类的属性\", Dog.__dict__)

        类的继承

        面向对象的编程带来一个好处代码重用实现方法之一继承

        类可以继承也可以继承别的继承父类继承子类继承过程中子类继承父类所有的属性行为一个父类可以多个子类一个子类可以有多个父类

单继承:一个类只有一个父类

class 子类名(父类):

class Da: \'\'\' 定义父类 \'\'\' num = 1 def __init__(self): print(\'调用父类的构造函数\') def house(self): print(\'父类有3个窝\') def NewNum(self,n): Da.num = n print(f\'父类现在有{Da.num}\')class Xiao(Da): \'\'\' 定义子类 \'\'\' def __init__(self): # 没这个就会调用父类的 print(\'调用子类的构造函数\') def basin(self): print(\'子类有两个盆\')xb = Xiao() # 子类实例化xb.house() # 调用父类的方法xb.basin()xb.NewNum(5) # 调用父类的方法 - 设置、获取属性值\'\'\'调用子类的构造函数父类有3个窝子类有两个盆父类现在有5\'\'\'
多继承:一个类有多个父类

如果子类和多个父类有相同的属性或方法,顺序:

子类 > 从左向右第一个父类 > 从左向右第二个父类

demo:

class A: def na(self): print(\'A\') def hobby(self): print(\'跑步\')class B: def na(self): print(\'B\') def play(self): print(\'够级\')class C(A, B): passc = C()c.na() # A 首先继承第一个父类c.hobby() # 跑步print(issubclass(C, A)) # Tureprint(issubclass(A, C)) # False# 判断第一个参数(C)是不是第二个参数(A)的子类print(isinstance(c, A)) # Ture# c是A,B,C的实例化对象

issubclass( ) 判断第一个参数是否是第二个参数的子类

isinstance( ) 判断第一个参数是否是第二个参数的实例化对象

        方法重写

父类中的方法不能满足子类的需求,可以在子类中重写父类的方法

不继承A

class A: def __init__(self, x, y): self.x = x self.y = y def addxy(self): print(self.x + self. y)# B 类 x y z求和class B(A): def __init__(self, x, y, z): self.x = x self.y = y self.z = z def addxy(self): print(self.x + self.y + self.z)

直接调用A的init函数,获取x y的参数值

class A: def __init__(self, x, y): self.x = x self.y = y def addxy(self): return self.x + self. y# B 类 x y z求和class B(A): def __init__(self, x, y, z): A.__init__(self, x, y) self.z = z def addxy(self): return A.addxy(self) + self.zb = B(2, 3, 4)print(b.addxy())
        基础重载方法

方法, 描述 & 简单的调用

__init__ ( self [,args...] ) 构造函数 简单的调用方法: obj = className(args)

__del__( self ) 析构方法, 删除一个对象 简单的调用方法 : del obj

__repr__( self ) 转化为供解释器(开发者)读取的形式 简单的调用方法 : repr(obj)

__str__( self ) 用于将值转化为适于人阅读的形式 简单的调用方法 : str(obj)

__cmp__ ( self, x ) 对象比较 简单的调用方法 : cmp(obj, x)        ,python3版本之后不支持

class Cat: def __init__(self, name, age): self.name = name self.age = age print(\'构造函数\') def __del__(self): print(\'析构函数\') # def __repr__(self): # return f\'名{self.name},{self.age}\' # # def __str__(self): # return f\'名{self.name},{self.age}\' def __lt__(self, other): print(self) print(other) return self.age < other.agehh = Cat(\'huahua\', 1)bb = Cat(\'baby\', 5)# print(\'12:\')# print(repr(hh))# print(str(hh))print(hh < bb) # print(hh.lessth(bb))print(\'175\', hh)print(\'176\', bb)\'\'\'# 注释前构造函数构造函数12:名huahua,1名huahua,1名huahua,1名baby,5True175 名huahua,1176 名baby,5析构函数析构函数\'\'\'\'\'\'# 注释后构造函数构造函数True175 176 析构函数析构函数\'\'\'
        运算符的重载

python3.n之后,不支持cmp方法,__ls__小于 __gt__大于 le

使用特定的符号实行操作。

__lt__ 小于

__gt__ 大于

__le__ 小于或等于

__ge__ 大于或等于

__add__ +

__sub__ -

__mul__ *

__ truediv__ /

3.多态

不同的对象对同一个方法做出不同的响应,用来设计更灵活的代码,提高代码的重复使用。

len()

字符串:计算字符串长度

列表、元组:计算元素个数

类的继承中用的方法重写就是一种实现多态的方法

python中,鸭子模型,一只鸟走起来像鸭子、行为也像鸭子,那么这只鸟可以被称为鸭子;没有这种类型的对象,但是有另一种类型的对象,和需要的对象有同一种行为,可以把其当成没有的对象来用。

demo:

class Cat: def say(self): print(\'miao~~\')class Dog: def say(self): print(\'wang~~\')class Duck: def say(self): print(\'ga~~\')cat = Cat()dog = Dog()duck = Duck()def fun(obj): obj.say()fun(cat) # miao~~fun(dog) # wang~~fun(duck) # ga~~

4.异常处理机制

AttributeError

访问对象没有的属性

ValueError

TypeError

IndexError

try,except,else,finally关键字组合不同异常处理方法。

格式:

try:

        # 可能发生异常代码

except

        # 异常发生执行代码

else:

        # 没有异常执行代码

finally:

        # 不管是否捕获异常最后都执行代码

demo:

s1 = \"sajd\"try: print(s1 + 3)# except TypeError: # 具体查找类型错误# except Exception: # 查找任意类型错误except Exception as e: # 查找任意类型错误,并且输出(e)错误类型 print(\"捕获到异常\") print(e)# else:# print(\"没有异常\")# finally:# print(\"最终执行此代码\")print(\"hello world\")# 输出:捕获到异常can only concatenate str (not \"int\") to strhello world
        迭代器(补充)

迭代python访问集合元素一种方式迭代器是一个可以记住遍历位置对象

迭代器对象集合第一个元素开始访问直到所有元素访问结束迭代器只能往前

迭代器两个基本方法iter()        next()

demo:

l1 = [1, 3, 5, 6, 8]l2 = iter(l1) # 创建一个迭代器print(next(l2)) # 1print(next(l2)) # 3for i in l2: print(i) # 5 6 8 
        生成器

yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

每次使用 yield 语句生产一个值后,函数都将暂停执行,等待被重新唤醒。

yield 语句相比于 return 语句,差别就在于 yield 语句返回的是可迭代对象,而 return 返回的为不可迭代对象。

然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句