Python之路,第二十篇:Python入门与基础20
python3 面向对象4
supper 函数
supper(type, obj) 返回绑定超类的实例(要求obj必须为type类型的实例)
supper() 返回绑定的超类的实例,等同于(class, 实例方法的第一个参数),此方法必须用在方法内部;
作用:返回绑定超类的实例,用超类的实例来调用其自身的方法;
class A(object):
def hello(self):
print("A类的hello(self)") class B(A):
def hello(self):
print("B类的hello(self)")
#self.__class__.__base__.hello(self) #A类的hello(self) b = B()
b.hello() #调用B类的方法
#调用基类的方法
super(B, b).hello() # A类的hello被调用,等同于B.__base__.hello(b) #A类的hello(self)
class A(object):
def hello(self):
print("A类的hello(self)") class B(A):
def hello(self):
print("B类的hello(self)")
#self.__class__.__base__.hello(self) #A类的hello(self) def super_hello(self): #此方法用来调用基类的hello方法
#self.hello() #调用B类的hello方法
super(B, self).hello() #可以简写为super().hello() b = B()
b.hello() #调用B类的方法
#调用基类的方法
#super(B, b).hello() # A类的hello被调用,等同于B.__base__.hello(b) #A类的hello(self)
b.super_hello() #A类的hello(self)
用于类的函数:
issubclass(cls, 类 或 类元组)
判断一个类是否是继承自其它的类,如果此类cls是类(class)或类元组中的一个派生子类,则返回True, 否则返回False;
查看帮助:
>>>help(__builtins__)可以查看所有内建类的帮助;
class A:
pass class B(A):
pass class C(B):
pass class D(C):
pass #判断是否继承其他类
print(issubclass(C, A)) #True
print(issubclass(C, B)) #True
print(issubclass(A, C)) #False
print(issubclass(C, D)) #False
print(issubclass(C, (A, B, D))) #True
#
print(issubclass(int, object)) #True
print(issubclass(int, bool)) #False
print(issubclass(bool, int)) #True
显示调用基类的构造方法:
def __init__(self, ....):
.........
#如何显示调用构造方法
#class A(object):
# """docstring for A"""
# def __init__(self, arg):
# super(A, self).__init__()
# self.arg = arg class Human:
def __init__(self, name, age):
self.name = name
self.age = age def infos(self):
print("姓名:",self.name,"年龄:",self.age) class Student(Human):
def __init__(self, name, age, score):
#self.name = name
#self.age = age
super(Student, self).__init__(name, age)# 可以简写为 super().__init__(name,age)
self.score = score def infos(self):
print("姓名:",self.name,
"年龄:",self.age,
"分数:",self.score) h1 = Human("张三", 20)
h1.infos() #姓名: 张三 年龄: 20 s1 = Student("李四",21, 100)
s1.infos() #姓名: 李四 年龄: 21 分数: 100
多态 polymorphic
什么是多态:
字面意思:“多种状态”;
多态是批在有继承/派生关系的类中,调用基类对象方法,实际能调用子类的覆盖方法现象叫多态;
多态调用的方法与对象相关,不与类型相关;
class Shape: #图形类
def drw(self):
self.drawSelf() class Point(Shape):
def drawSelf(self):
print("正在画一个点.") class Circle(Point):
def drawSelf(self):
print("正在画一个圆.") shape = Point()
shape.drw() #正在画一个点. shape = Circle()
shape.drw() #正在画一个圆.
面向对象思想的特征:
1, 封装
2, 继承(派生)
3,多态
class OrderSet(list):
def add(self, n):
for i in range(len(self)):
self[i] += n L = OrderSet()
L.append(10)
L.append(19)
print(L) #[10, 19]
L.add(2)
print(L) #[12, 21]
封装
作用:封装是指隐藏类的实现细节,让使用者不关心这些细节;
注:python的封装是假的(模拟的)封装;
私有实例变量和方法:
python中,以双下划线开头"__"开头,不以双下划线结尾的标识符,为私有成员;
私有成员分为:私有属性和私有方法
私有成员在子类和类外部无法访问;
class A:
def __init__(self, args):
self.__p = None
self.__p = args def __private_method(self):
print("你好,我是私有方法.") def showA(self):
print("self.__p",self.__p)
self.__private_method() class B(A):
def __init__(self):
super().__init__(0) def myfun(self):
pass
#print("self.__p", self.__p) #错的,不能使用私有属性
#self.__private_method() #错的,不能使用私有方法 b = B()
b.myfun() # a = A(100)
a.showA()
#私有方法不能在类外部调用
#a.__private_method()
#私有属性不能在外部使用
#a.__p -= 2
#print(a.__p)
多继承 multiple inheritance
多继承是指一个子类继承自两个或两个以上的基类;
多继承的语法:
class 类名(超类1,超类2,......):
......
class Car: #汽车类
def run(self, speed):
print("汽车以",speed, "km/h的速度行驶") class Plane: #飞机类
def fly(self, height):
print("在海拔", height, "米高度飞行.") class PlaneCar(Car, Plane):
"""PlaneCar 类 同时继承自汽车和飞机""" pl = PlaneCar()
pl.fly(10000)
pl.run(250)
多继承的问题(缺陷): 标识符的冲突问题,要谨慎使用多继承;
class A:
def __init__(self):
self.name = "A" class B:
def __init__(self):
self.name = "B" class AB(A, B): #感觉A类、B类都可以用
def infos(self):
print(self.name) # ab = AB()
ab.infos() #结果是"A" ; 不是"A","B".
#######################################
class A:
def __init__(self):
self.name = "A" class B:
def __init__(self):
self.name = "B" class AB(B, A): #感觉A类、B类都可以用
def infos(self):
print(self.name) # ab = AB()
ab.infos() #结果是"B" ; 不是"A","B".
PEP8 编码标准:
代码编写:
1,使用4个空格进行退进,不使用TAB,更不允许使用TAB和空格混用;
2,每行最大长度79个字节,超过部分使用反斜杠折行;
3,类和全局函数定义间隔两个空行,类内方法定义间隔一个空行,其他地方不加空行;
文档编排:
1,import部分 按标准,三方和自己编写的顺序依次排序,之间空一行;
2,不要在一名import 中导入多个库模块,如 import os , sys, time应写成多行;
3, 尽可能用import XX ,而不用from xx import yy 引用库, 因为可能出现名字冲突;
空格的使用:
1,各种右括号前不用加空格
L = [1,2,3] # OK
L = { 1,2,3 } # } 前不要加空格;
2,逗号,冒号,分号前不要加空格;
3,函数左括号前不要加空格;
4,操作符左右各加一个空格,不要为了对齐增加空格;
5,函数的默认参数使用的赋值符左右省略空格(def xxx(a=1,b=2):));
6,不要将多句语句写在同一行,尽量不要加用分号;。
7,if/for/while语句中,即使执行语句只有一句,也必须另起一行;
========
总结:
1,python中闭包必须满足三大特点 :1.闭包函数必须有内嵌函数 2.内嵌函数需要引用该嵌套函数上一级namespace中的变量 3.闭包函数必须返回内嵌函数;
2,如果你不想在异常发生时结束你的程序,只需在try里捕获它。
3,_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
========
Python之路,第二十篇:Python入门与基础20的更多相关文章
- Python之路(第二十篇) subprocess模块
一.subprocess模块 subprocess英文意思:子进程 那什么是进程呢? (一)关于进程的相关理论基础知识 进程是对正在运行程序的一个抽象,进程的概念起源于操作系统,是操作系统最核心的概念 ...
- Python开发【第二十篇】:缓存
Python开发[第二十篇]:缓存redis&Memcache 点击这里 Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy ...
- Python之路(第二十九篇) 面向对象进阶:内置方法补充、异常处理
一.__new__方法 __init__()是初始化方法,__new__()方法是构造方法,创建一个新的对象 实例化对象的时候,调用__init__()初始化之前,先调用了__new__()方法 __ ...
- Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类
一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...
- Python之路(第二十五篇) 面向对象初级:反射、内置方法
[TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...
- Python之路(第二十四篇) 面向对象初级:多态、封装
一.多态 多态 多态:一类事物有多种形态,同一种事物的多种形态,动物分为鸡类,猪类.狗类 例子 import abc class H2o(metaclass=abc.ABCMeta): def _ ...
- Python之路(第二十六篇) 面向对象进阶:内置方法
一.__getattribute__ object.__getattribute__(self, name) 无条件被调用,通过实例访问属性.如果class中定义了__getattr__(),则__g ...
- Python之路(第二十二篇) 面向对象初级:概念、类属性
一.面向对象概念 1. "面向对象(OOP)"是什么? 简单点说,“面向对象”是一种编程范式,而编程范式是按照不同的编程特点总结出来的编程方式.俗话说,条条大路通罗马,也就说我们使 ...
- Python之路(第二十一篇) re模块
一.re模块 正则表达式本身是一种小型的.高度专业化的编程语言,正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re,正则表达式模式被编译成一系列的字节码,然 ...
- Python之路(第二十三篇) 面向对象初级:静态属性、静态方法、类方法
一.静态属性 静态属性相当于数据属性. 用@property语法糖装饰器将类的函数属性变成可以不用加括号直接的类似数据属性. 可以封装逻辑,让用户感觉是在调用一个普通的数据属性. 例子 class R ...
随机推荐
- Mybatis中,当插入数据后,返回最新主键id的几种方法,及具体用法
insert元素 属性详解 其属性如下: parameterType ,入参的全限定类名或类型别名 keyColumn ,设置数据表自动生成的主键名.对特定数据库(如PostgreSQL),若自动生成 ...
- PHP指针相关函数
1.each each — 返回数组中当前的键/值对并将数组指针向前移动一步 $arr = array("one", "two", "three&qu ...
- 【转】vue技术分享-你可能不知道的7个秘密
一.善用watch的immediate属性 这一点我在项目中也是这么写的.例如有请求需要再也没初始化的时候就执行一次,然后监听他的变化,很多人这么写: created(){ this.fetchPos ...
- 牛客网 PAT 算法历年真题 1011 : 个位数统计 (15)
个位数统计 (15) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 给定一个k位整数N = dk-1*10k- ...
- python 利用turtle库绘制七段数码管的方式,绘制当前事件(时分秒00:00:00)
# coding:utf-8# 绘制七段数码管,显示当前时间import timeimport turtle as tt # 绘制间隔def drawGap(): tt.penup() tt.fd(3 ...
- Ubuntu16.10下使用VSCode开发.netcore
按照通常的套路,首先创建一个空白的解决方案,需要用到.netcore sdk命令: dotnet new sln -o dotnetcore_tutrorial 这个时候可以看到在目标目录下生成了一个 ...
- 尚学堂java答案解析 第三章
本答案为本人个人编辑,仅供参考,如果读者发现,请私信本人或在下方评论,提醒本人修改 一.选择题 1.A 2.BD 解析:switch的的判断表达式的数据类型:byte short int ch ...
- objectstate对象三种状态
1.临时状态:new对象的过程,刚被创建出来,数据库中没有对应数据 2.持久状态:session.save(),数据库中有对应数据,session中也有对应数据 3游离状态:数据库中有对应数据,ses ...
- java⑥
import java.util.Scanner; /** * 所有在java.lang包下面的所有类 不需要显示的引入包! * java.util.Scanner : 想获取用户的输入 必须引入相关 ...
- Springboot+MyBatis+mysql+jsp页面跳转详细示例
SpringBoot与MyBatis搭建环境,底层数据库为mysql,页面使用JSP(官网上不推荐使用jsp),完成从数据库中查询出数据,在jsp页面中显示,并且实现页面的跳转功能. 项 ...