1. isinstance和type:

  is和==符号,is指的是内存地址,是不是一个对象,ID知否相同

  集成链

class A:
pass class B(A):
pass b = B()
print(isinstance(b,B))
print(isinstance(b,A)) print(type(b) is B)
print(id(type(b)),id(B))
#

2. 类变量和对象变量:

  类中的self == 实例,其实就等于a = A()的a,等于传递进去,这就是为什么类中有self的原因。

class A:
aa =
def __init__(self,x,y):
self.x = x
self.y = y a = A(,)
A.aa =
a.aa =
print(a.x,a.y,a.aa)
#
print(A.aa)
# print(A.x,A.y) # 抛异常 #
#

  记住:查找的顺序是由下而上进行查找

  记住:类变量只能通过类来更改,如果通过实例去更改,只会开辟一块儿新的变量,类的变量其实不能更改,但是看起来是一个变量。类的变量是所有成员共享的。

3. 类属性和实例属性的查找顺序:

  定义在内部的实例或者方法。

  查找分深度查找和广度查找,其实前面有类名.__init__这样继承父类的方式就是深度查找,我们Py3用的是MRO算法,用的是C3,super()就是一种C3的查找方法。

class A:
name = "A"
def __init__(self):
self.name = "obj" a = A()
print(a.name)
# 会打印obj回不到name变量

  

class D:
pass class C(D):
pass class B(D):
pass class A(B,C):
pass print(A.__mro__)
# (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>)

  记住:可以用__MRO__查看继承链的关系。

  记住:py2,必须要写object才有object,py3.不用写也会继承object,是一种新式类

4. 静态方法、类方法、对象方法(实例方法):

class Date:
# 构造函数
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day def tomoroow(self):
self.day += @staticmethod
def parse_from_string(date_str):
year, month, day = tuple(date_str.split("-"))
return Date(int(year),int(month),int(day)) @staticmethod
def valid_str(date_str):
year, month, day = tuple(date_str.split("-"))
if int(year)> and (int(month)> and int(month)<) and (int(day)> and int(day)<=):
return True
else:
return False @classmethod
def from_string(cls,date_str):
year, month, day = tuple(date_str.split("-"))
return cls(int(year),int(month),int(day)) def __str__(self):
return "{year}/{month}/{day}".format(year=self.year,month=self.month,day=self.day) if __name__ == '__main__':
new_day = Date(,,)
new_day.tomoroow()
print(new_day) #--
# date_str = "2019-6-7"
# year,month,day = date_str.split("-")
# print(year,month,day) #用staticmethod完成初始化
date_str = "2019-6-7"
new_day = Date.parse_from_string(date_str)
print(new_day) # 用staticmethod完成初始化
date_str = "2019-6-7"
new_day = Date.from_string(date_str)
print(new_day) print(Date.valid_str(date_str))

  记住:类中有属性和方法,前面我们说了属性分:类属性,对象属性(实例属性),还有一种静态属性。在方法这个层面也分:类方法、静态方法和对象方法(实例方法)。

  记住:对象方法平时用的很多,记住在类中的self就是用于传回实例的那个标签的。

  记住:静态方法和类方法相同点就是可以直接通过类来进行访问,不用再实例化。 不同点是:如果返回值是类名的话,静态方法每次都要更改return 类名,而类方法不用。

  记住:静态方法@staticmethod,中的是self。类方法@staticclass,中的是cls。这两种其实就是和什么关联。

5. 数据封装和私有属性:

class User:
def __init__(self,birthday):
self.__birthday = birthday def get_age(self):
return - self.__birthday class Student(User):
def __init__(self,birthday):
self.__birthday = birthday if __name__ == '__main__':
user = User()
print(user.get_age())
# print(user.__birthday) # 不能访问
print(dir(user))
# ['_User__birthday',
print(user._User__birthday)
print(user._Student__birthday)

  记住:私有属性在Py中突破的比较简单一些,不用通过反射机制。

  记住:私有属性其实就是在类中创建了一个_类名.__私有属性的变量而已。我们可以通过dir看到这个变量。而且可以直接拿到那个私有属性。

6. Py的自省:

  通过一定的机制查询到对象的内部结构。

class Person:
"""

"""
name = "user" class Student(Person):
def __init__(self,school_name):
self.school_name = school_name if __name__ == '__main__':
user = Student("Oxford") # 通过__dict__查询属性。
print(user.__dict__)
# {'school_name': 'Oxford'}
print(user.name)
# user
print(Person.__dict__) user.__dict__["schoole_addr"] = "北京"
print(user.__dict__)
# {'school_name': 'Oxford', 'schoole_addr': '北京'} print(dir(user))

  记住:查看类中的属性的两个魔法函数是__dict__和dir,其中dict是一种高效的数据存储方式。用dir可以查看全部的。

  记住:__doc__是查看类中的文档注释内容的。

7. super函数:

  实际上就是调用我们的父类。

class A:
def __init__(self):
print("A") class B(A):
def __init__(self):
print("B")
# super(B,self).__init__() #这是Py2的用法
super().__init__() # 这是Py3的用法。 # 既然重写了B的构造函数,为什么还要去调用super
# super到底执行顺序是什么样的? if __name__ == '__main__':
b = B()

  记住:查找顺序就是MRO

  记住:Py2的调用方法和Py3的调用方法不同,但是Py3也可以用Py2的格式。

8. 类的调用关系:

  mixin模式(属于Python几大设计模式中的一个,后面说)

  minin类功能单一

  不和基类管理啊,可以和任意基类组合,基类可以不和mixin关联就能初始化成功

  在mixin中不要使用super之中用法。

9. 上下文管理器with和contextlib

def exe_try():
try:
# f_read = open("bobby.txt")
print("code started")
# f_read.close()
raise KeyError
return
except KeyError as e:
print("key error")
return
else:
print("other error")
return
finally:
print("finally")
return if __name__ == '__main__':
result = exe_try()
print(result)
# 如果有finally语句会return ,如果没有finally的话,执行try和Except语句,返回2

  上下文管理器协议(是协议就要和魔法函数挂钩)

  因此涉及到了__enter__和__exit__

# 上下文管理器协议
class Sample:
def __enter__(self):
print("enter")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("exit")
def __str__(self):
return "this is finally?"
def do_something(self):
print("do something")
with Sample() as sample:
sample.do_something()
print(sample)

  记住:上下文管理器,其实就是规定类的进和出的关系。比如我们用with open as f:这样的管理方式,就是在open当中规定了__enter__和__exit__两个魔法函数。进出关系,所以不用关闭了。

  记住:__exit__指的是最后的退出,因此里面要打印字符串打印的__str__是在这个之前的。

  import contextlib

import contextlib

@contextlib.contextmanager
def file_open(filename):
print("file open") # __enter__
yield {}
print("file close") # __exit__ with file_open("bobby.txt") as f_opened:
print("file processing") # file open
# file processing
# file close

  记住:上下文管理器函是一个用装饰器的方式生成一个上下文管理器,巧妙的运行了生成器的特性。yield的方式。

  

  

Python说文解字_杂谈05的更多相关文章

  1. Python说文解字_杂谈09

    1. 元类编程代码分析: import numbers class Field: pass class IntField(Field): # 数据描述符: # 初始化 def __init__(sel ...

  2. Python说文解字_杂谈08

    1. Python变量到底是什么? Python和Java中的变量本质不一样,python的变量实质是一个指针 int str,便利贴 a = 1 # 1. a贴在1上面 # 2. 它的过程是先生成对 ...

  3. Python说文解字_杂谈07

    1. 深入dict from collections.abc import Mapping,MutableMapping # dict 属于mapping类型 a = {} print(isinsta ...

  4. Python说文解字_杂谈01

    1. Python在Ubuntu下面下载Python 2. 安装依赖包 sudo apt-get update sudo apt-get install build-essential python- ...

  5. Python说文解字_杂谈06

    1. 序列类型的分类: 容器类型:list.tuple,deque 扁平序列:str.bytes.bytearray.array.array 可变序列:list.dequte.bytearray.ar ...

  6. Python说文解字_杂谈04

    1. 鸭子类型: 当你看到一只鸟走来像鸭子,游泳起来像鸭子,叫起来也像鸭子,他么他就可以叫做鸭子.任何可迭代的对象.一样的方法,可以用可迭代的话,就可以迭代的组合打印.__getitem__可以塞到任 ...

  7. Python说文解字_杂谈03

    1. 我们从前面的知识得到,所有的类都要继承自object这个基类(超类),另外我们知道“继承”可以继承类的属性和方法.我们起始通过type创建类的时候,自然而然的也会从ojbect继承他的一些属性和 ...

  8. Python说文解字_杂谈02

    1. Py中三个中啊哟的概念type.object和class的关系. type生成了int生成了1 type->class->obj type用来生成类对象的 object是最顶层的基类 ...

  9. Python说文解字_详解元类

    1.深入理解一切接对象: 1.1 什么是类和对象? 首先明白元类之前要明白什么叫做类.类是面向对象object oriented programming的重要概念.在面向对象中类和对象是最基本的两个概 ...

随机推荐

  1. 001、JAVA开发环境安装与eclipse软件第一印象

    折腾了快1个星期,一直没有成功装好JAVA环境,eclipse一直打不开,java环境配置的问题真是不得不吐槽一下,太烂了.今天反反复复折腾好久,终于搞定了.用的金山毒霸,方法如下: 一.打开金山毒霸 ...

  2. 【转】在C#中?,?:和??

    符号:?名称:可空类型修饰符.引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.为了使值类型 ...

  3. vue使用Vant UI中的swiper组件及传值

    子组件SwiperBanner <!-- --> <template> <div class="swiper"> <van-swipe : ...

  4. 【Android】家庭记账本手机版开发报告五

    一.说在前面   昨天  1.添加菜单(查询.清除所有等)2.使用滑动删除   今天 1.创建登入和注册界面 2.向数据库添加一张用户表   问题 做完后在登入时有bug(未解决) 二.界面的搭建 1 ...

  5. UVA - 11892 ENimEN(博弈)

    题意:有n堆石子,两个人拿,拿走最后的石子的人赢,poopi先拿,条件是,每个人必须从另外一个人最后拿过的石子堆中取石子,若那堆石子被拿没了,才可以自由地拿其他堆.要求每次拿的石子数不能为0.问谁赢. ...

  6. POJ 2443:Set Operation 经典位运算好题

    Set Operation Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2965   Accepted: 1196 Des ...

  7. POJ 2996:Help Me with the Game

    Help Me with the Game Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64 ...

  8. Django xadmin图片上传与缩略图处理

    基本摘要 用python django开发时,个人选中Xadmin后台管理系统框架,因为它*内置功能丰富, 不仅提供了基本的CRUD功能,还内置了丰富的插件功能.包括数据导出.书签.图表.数据添加向导 ...

  9. hive的join优化

    “国际大学生节”又称“世界大学生节”.“世界学生日”.“国际学生日”.1946年,世界各国学生代表于布拉格召开全世界学生大会,宣布把每年的11月17日定为“世界大学生节”,以加强全世界大学生的团结和友 ...

  10. 电脑连接了HDMI线,电脑没有声音了,原因和解决办法

    我们经常会使用笔记本电脑通过HDMI线外接显示器或者投影仪设备,会遇到笔记本电脑没有声音或者声音很小的问题. 没有声音说明电脑的播放设备(扬声器)设置问题,可以通过查看扬声器情况解决. 如图所示: 需 ...