python继承

Python多态

岁酱吖の 提交于 2020-03-07 20:55:14
1.多态 其他语言中所谓的多态,至的是一个方法多种实现,在继承前提下,父类规定了子类的接口,使得可以相同的方式调用子类的方法,但会获得不同的功能 Python崇尚的是"鸭子类型(Duck typing)",这个词概念名字来源于由James Whitcomb Riley提出的鸭子测试,"鸭子测试"可以这样表述:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来像鸭子、那么这只鸟可以被称为鸭子”。’'鸭子类型”中不关心对象的类型,只关心对象的行为。 鸭子类型是动态类型的一种风格,在这种风格中,一个对象有效的语义,不是由继承自特定类或实现特定的接口,二十由“当前方法和属性的集合”决定。 2.算数运算符重载 class MyInt ( object ) : def __init__ ( self , num ) : if isinstance ( num , int ) : self . num = num else : raise Exception ( "类型错误" ) # 本类的加法运算符重载 + def __add__ ( self , other ) : # 两个同类型的对象相加,返回一个新的同类对象 # return self.num + other.num #error return MyInt ( self . num + other . num ) # += a += b

Python Type Hint类型注解

风流意气都作罢 提交于 2020-03-07 17:39:31
原文地址: https://realpython.com/python-type-checking/ 在本指南中,你将了解Python类型检查。传统上,Python解释器以灵活但隐式的方式处理类型。Python的最新版本允许你指定可由不同工具使用的显式类型提示,以帮助您更有效地开发代码。 通过本教程,你将学到以下内容: 类型注解和提示(Type annotations and type hints) 代码里添加静态类型 静态类型检查 运行时强制类型一致 这是一个全面的指南,将涵盖很多领域。如果您只是想快速了解一下类型提示在Python中是如何工作的,并查看类型检查是否包括在您的代码中,那么您不需要阅读全部内容。Hello Types和正反两部分将让您大致了解类型检查是如何工作的,并介绍它在什么时候有用。 Type Systems 所有的编程语言都包括某种类型的系统,该系统将它可以处理的对象类别以及如何处理这些类别形式化。例如,类型系统可以定义一个数字类型,其中42是数字类型对象的一个例子。 动态类型 Python是一种动态类型语言。这意味着Python解释器仅在代码运行时进行类型检查,并且允许变量的类型在其生命周期内进行更改。以下示例演示了Python具有动态类型: if False: ... 1 + "two" # This line never runs, so no

Python面向对象编程 - 4

断了今生、忘了曾经 提交于 2020-03-06 22:27:39
特殊成员和魔法方法 Python中有大量类似__doc__这种以双下划线开头和结尾的特殊成员及“魔法方法”,它们有着非常重要的地位和作用,也是Python语言独具特色的语法之一! __init__ : 构造函数,在生成对象时调用 __del__ : 析构函数,释放对象时使用 __repr__ : 打印,转换 __setitem__ : 按照索引赋值 __getitem__: 按照索引获取值 __len__: 获得长度 __cmp__: 比较运算 __call__: 调用 __add__: 加运算 __sub__: 减运算 __mul__: 乘运算 __div__: 除运算 __mod__: 求余运算 __pow__: 幂 1.__doc__ 说明性文档和信息。Python自建,无需自定义。 class Foo: """ 描述类信息,可被自动收集 """ def func(self): pass # 打印类的说明文档 print(Foo.__doc__) 2.__init__() 实例化方法,通过类创建实例时,自动触发执行。 class Foo: def __init__(self, name): self.name = name self.age = 18 obj = Foo(jack') # 自动执行类中的 __init__ 方法 3.__module__和__class__ _

python(Django之html模板继承)

巧了我就是萌 提交于 2020-03-06 21:48:37
# coding=utf-8from django.shortcuts import renderfrom django.http import HttpResponsefrom models import *def index(request): # hero=HeroInfo.objects.get(pk=1) # context={'hero':hero} list = HeroInfo.objects.filter(isDelete=False) context = {'list': list} return render(request, 'booktest/index.html', context)def show(request, id, id2): context = {'id': id} return render(request, 'booktest/show.html', context)# 用于练习模板的继承def index2(request): return render(request, 'booktest/index2.html')def user1(request): context = {'uname': '习总'} return render(request, 'booktest/user1.html', context)def user2

python中多重继承与获取对象

怎甘沉沦 提交于 2020-03-06 06:46:29
1、python中多重继承 除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。 多重继承的继承链就不是一棵树了,它像这样: class A(object): def __init__(self, a): print 'init A...' self.a = a class B(A): def __init__(self, a): super(B, self).__init__(a) print 'init B...' class C(A): def __init__(self, a): super(C, self).__init__(a) print 'init C...' class D(B, C): def __init__(self, a): super(D, self).__init__(a) print 'init D...' 看下图: 像这样,D 同时继承自 B 和 C,也就是 D 拥有了 A、B、C 的全部功能。多重继承通过 super()调用__init__()方法时,A 虽然被继承了两次,但__init__()只调用一次: >>> d = D('d') init A... init C... init B... init D... 多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。 举个例子

python 封装

 ̄綄美尐妖づ 提交于 2020-03-06 00:55:03
1 封装 封装,即隐藏对象的属性和实现细节,仅对外公开接口。 2 为什么要封装 封装数据:可以保护隐私(比如银行卡号、密码) 封装方法:隔离复杂度(把内部具体的复杂实现过程隐藏起来。) 在python中因为没有像java中那样的接口实现。所以我们这里说的向外提供的接口,是函数,也叫接口函数。 3 封装有哪些表现 3.1 python自带的封装 创建一个类或对象,就会创建二者的命名空间,只需要用类名.或对象.的方式访问命名空间里的变量名,就是一种封装。 >>> r1.nickname '德玛西亚之力' >>>Riven.camp 'Noxus' 3.2 类中的封装 将类中的某些变量属性和方法隐藏(或者说定义为私有),只在类内部使用、访问,或留下少量函数接口给外部访问。 在python中,在变量名或函数名前加“__”来实现属性的隐藏(设置为私有) class A: __x=0 def __init__(self): self.__y = 10 def __func(self): print("from A") a=A() #print(a.__y) #AttributeError: 'A' object has no attribute '__y' #a.__func() #AttributeError: 'A' object has no attribute '__func'

python Django 中间件介绍

天涯浪子 提交于 2020-03-05 17:13:53
我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下面的MIDDLEWARE配置项,django默认自带的一些中间件: MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'utils.middlewares.MD1', 'utils.middlewares.MD2'] 我们之前已经接触过一个csrf相关的中间件了?我们一开始让大家把他注释掉,再提交post请求的时候,就不会被forbidden了,后来学会使用csrf

Python-类的私有成员

折月煮酒 提交于 2020-03-05 13:45:59
1.鸭子类型:编程思想 一只鸟,长得像鸭子就是鸭子,叫声像鸭子就是鸭子,走起来像鸭子就是鸭子 归一化,统一接口 2.类的约束:控制子类定义一些方法 方法一:推荐使用 raise:主动抛出异常 方法二: from abc iport ABCMeta,abstractmethod 抽象类,接口类:指定一些规则 3.super 按照mro的查找顺序进行查找 super(类名,self)从当前mro中查找类名的下一个类 super时按照mro的顺序进行继承 4.类的私有成员 以__开头的变量就是私有的 _desires = "有欲望" (程序员之间预定俗称)类私有的属性 私有属性和方法在当前类中可以查看及使用 子类不能继承父类的私有方法和属性 私有的目的就是保护数据的安全性 强制查看私有方法或属性:(但是非常不推荐使用) _类名私有变量名 _类名私有方法名 class Human: live = '有理想' # 类共有的属性 __desires = '有欲望' # (程序级别)类私有的属性 _desires = '有欲望' # (程序员之间约定俗称)类私有的属性 def __init__(self,name,age,sex,hobby): self.name = name self.age = age self.sex = sex # 对象的共有的属性 self.__hobby =

记录遇到的Python陷阱和注意点

一个人想着一个人 提交于 2020-03-05 13:24:02
最近使用Python的过程中遇到了一些坑,例如用 datetime.datetime.now() 这个可变对象作为函数的默认参数,模块循环依赖等等。 在此记录一下,方便以后查询和补充。 避免可变对象作为默认参数 在使用函数的过程中,经常会涉及默认参数。在Python中,当使用可变对象作为默认参数的时候,就可能产生非预期的结果。 下面看一个例子: def append_item(a = 1, b = []): b.append(a) print b append_item(a=1) append_item(a=3) append_item(a=5) 结果为: [1] [1, 3] [1, 3, 5] 从结果中可以看到,当后面两次调用 append_item 函数的时候,函数参数b并没有被初始化为 [] ,而是保持了前面函数调用的值。 之所以得到这个结果,是因为在Python中, 一个函数参数的默认值,仅仅在该函数定义的时候,被初始化一次 。 下面看一个例子证明Python的这个特性: class Test(object): def __init__(self): print("Init Test") def arg_init(a, b = Test()): print(a) arg_init(1) arg_init(3) arg_init(5) 结果为: Init Test 1 3

编程语言工具和环境

此生再无相见时 提交于 2020-03-04 19:58:19
什么是python的生成器? python生成器是一个返回可以迭代对象的函数,可以被用作控制循环的迭代行为。生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,一般的函数会返回包括所有数值的数组,生成器一次只能返回一个值,这样消耗的内存将会大大减小。 yield生成器解释 Java抽象类和接口的区别? Java中,一个类可以实现多个接口,但是一个类只能继承一个抽象类。 接口中只包含接口签名,而抽象类可以提高默认实现,子类可以重载抽象类方法。 接口中默认的所有方法均为public修饰,而抽象类可以用protected修饰符。 接口中不允许定义任何属性,而抽象类中可以定义属性和常量在应用场景中。 在应用场景中使用接口来完成同一方法的不同实现,若不同的方法实现需要共享同样的行为或状态则用抽象类。 python中is和==的区别 is是用来判断两个变量引用的对象是否为同一个,==用于判断引用对象的值是否相等。可以通过id()函数查看引用对象的地址。 python方法解析顺序 Python的方法解析顺序优先级从高到低为:实例本身->类->继承类(继承关系越近,越先定义,优先级越高) 方法解析:是一种在多重继承中用于确定方法搜索顺序的算法. Ctrl+C程序挂掉还是抛出异常,如何判断两个dict是否一样,list头上删除元素,字符串拼接? Ctrl+C会挂掉程序