Python学习---面向对象的学习[深入]
类的深入学习
a. Python中一切事物都是对象
b. class Foo:
pass
obj = Foo()
# obj是对象,Foo类
# Foo类也是一个对象,type的对象
c. 类都是type类的对象 type(..)
“对象”都是以类的对象 类()
d. 类实际上是type类型的对象,所有的类都是Object的子类
创建类的方法[2种]
# 第一种:类实际上是type类型的对象,所有的类都是Object的子类
Foo = type('Foo', (object,), {'func': 'function'}) # 第二种:
class Foo:
def func(self):
print(123)
f = Foo()
f.func()
利用metaclass创建类: 必须继承type类,同时init必须传递4个参数过去
必须继承type类 ---代码有误---
class MyType(type): # the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
# 必须给出4个参数
def __init__(self, *args, **kwargs): # __init__() takes 1 positional argument but 4 were given
print('Mytype创建类对象')
def __call__(self, *args, **kwargs):
print('Mytype的call方法')
def __new__(self, *args, **kwargs):
print('Mytype的new方法')
class Foo(object, metaclass=MyType):
def func(self):
print(123)
# 创建对象后执行init方法
def __new__(self, *args, **kwargs):
print('Foo的new方法')
return '返回Foo的对象'
f = Foo() # 调用MyType的__init__方法,Foo是MyType的对象,Foo()会调用MyType的__call__方法
f.func() # Mytype创建类对象,这里是有MyType的
# 123
【转载】类的创建原理图:

异常处理
被动异常
try:
pass
except IndentationError as e:
pass
except ValueError as e: # 小的Exception放在Exception前面
pass
except Exception as e: # e是Exception的对象,封装了Exception信息
pass
else: # 正常代码正常,则执行else,否则执行else
pass
finally:
pass # 出错不出错,一定要执行的代码
主动触发异常: raise Exception("Sorry")
try:
raise Exception("Sorry")
except Exception as e:
print(e)
自定义异常:继承Exception类来实现
class HhH(Exception):
def __init__(self, msg):
self.message = msg
def __str__(self):
return self.message # 这里只需要返回就可以了,不能直接打印
try:
raise HhH('hhh, Wrong')
except HhH as e:
print(e)
断言assert
assert 比较的内容: 条件成立,则打印XXX,否则报错
一般用强制用户的服从,Java从1.2开始也添加了这个功能,但是一般实际中不用。Python源码中有用到
assert 1 < 5
print('hhh')
反射
1. 通过字符串操作对象的成员(方法,字段):
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age
def fun(self):
print('%s-%s' % (self.name, self.age)) obj = Foo('ftl', 23)
print(obj.name)
b = 'name'
print('obj.__dict__[b]:',obj.__dict__[b]) # 通过字典取值
print("getattr(obj, 'name'):",getattr(obj, 'name')) # 通过内置函数getattr取出值
fun = getattr(obj, 'fun')
fun()
setattr(obj, 'school', 'xupt')
print(hasattr(obj, 'school'))
print(delattr(obj, 'school'))

模块级别的反射:
class Foo():
NAME = 'ftl'
def hello(self):
print('hello')
print(getattr(Foo, 'NAME'))
hello = getattr(Foo(), 'hello') # 取到函数的内存地址
print(hello)
print(hello()) # 取到函数的对象
单例模式
class Foo:
__instance = None def __init__(self, name, age):
self.age = age
self.name = name @classmethod # 静态方法
def get_Instance(cls):
if cls.__instance:
return cls.__instance
else:
cls.__instance = Foo('hhh', 23)
return cls.__instance def show(self):
print(self.age, self.name)
obj = Foo.get_Instance()
obj.show()
【更多学习】
Python学习---面向对象的学习[深入]的更多相关文章
- Python之面向对象编程学习
不知不觉,学到了python的面向对象编程思想.今天我们来讨论下面向对象编程的思想. 顾名思义,面向对象,就是面向于对象,这里所说的对象不是你现实生活中你的女朋友,你的老婆,你的爱人,在编程的世界里面 ...
- 【我要学python】面向对象系统学习
第一节:初识类的定义和调用 c1.py #类 = 面向对象 #类 最基本作用:封装 #类中不仅可以定义变量 还可以定义函数等等,例: class student( ): name = ' ' age ...
- Python学习---面向对象的学习[基础]
面向对象 面向对象的三大特性是指:封装.继承和多态. 说明: Python可以函数式编程,也可以面向对象编程 l 面向过程:根据业务逻辑从上到下写垒代码 l 函数式 :将某功能代码封装到函数中,日后便 ...
- PyTorch框架+Python 3面向对象编程学习笔记
一.CNN情感分类中的面向对象部分 sparse.py super(Embedding, self).__init__() 表示需要父类初始化,即要运行父类的_init_(),如果没有这个,则要自定义 ...
- python学习------面向对象的程序设计
一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
- python语法学习面向对象之继承
python语法学习面向对象之继承 转载自:http://www.cnblogs.com/Joans/archive/2012/11/09/2757368.html 只要涉及到面向对象,”类“是必须出 ...
- 转 python语法学习面向对象之继承
传送门 python语法学习面向对象之继承 只要涉及到面向对象,”类“是必须出现的一个代名词. 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象是这个类的实例. 类的一些概念: 包括初始 ...
- Python第八课学习
Python第八课学习 www.cnblogs.com/resn/p/5800922.html 1 Ubuntu学习 根 / /: 所有目录都在 /boot : boot配置文件,内核和其他 linu ...
随机推荐
- 《LeetBook》leetcode题解(5):Longest Palindromic [M]——回文串判断
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- codeblocks 控制台一闪而过
不要点红的运行,那是调试,点绿色的三角形,那才是运行,不会一闪而过
- WPF中Window的ShowInTaskbar、Owner和Topmost属性
1. ShowInTaskbar:设置窗口是否在任务栏上有一席之位,默认为true, 当在父窗口上新开一个子窗口时,任务栏上就会出现两个窗口,所以当要实现 不管开启多少个窗口,在任务栏上都只显示一个窗 ...
- Winform为窗体增加快捷键
1. 定义窗体的 xxx_KeyDown(object sender, EventArgs e) 2. 书写快捷键的代码: //这里的xxx代表你的窗体名 private void xxxx_KeyD ...
- mysql去除重复记录案例
例1,表中有主键(可唯一标识的字段),且该字段为数字类型 1 测试数据 /* 表结构 */ DROP TABLE IF EXISTS `t1`; CREATE TABLE IF NOT EXISTS ...
- rails 中 create, new, build, save 的用法以及误区汇总 (转)
自己很初级,初级的不能再初级,所以初次接触rails的时候,对于里面的create,new,build等方法不是很了解,用的很混乱,导致经常出现不必要的bug,很苦恼,决定,总结一下,结合网上已有资源 ...
- C#中的分部类和分部方法:partial
这篇文章主要介绍了C#中的分部类和分部方法,讲解了类的拆分和方法的定义的拆分,需要的朋友可以参考下可以将类或结构.接口或方法的定义拆分到两个或多个源文件中.每个源文件包含类型或方法定义的一部分,编译应 ...
- docker部署ELK日志处理
docker环境下部署的ELK系统,日志处理,保留最近五个小时的日志 dockerlog.sh #!/bin/bash logs=`find /var/lib/docker/containers/ - ...
- flask中的数据操作
flask中数据访问: pip install flask-sqlalemy 创建数据: 创建app的工厂 from flask import Flask from flask_sqlalchemy ...
- K:线性表的实现—顺序表
所谓顺序表,就是顺序存储的线性表.顺序存储就是用一组地址连续的存储单元依次存放线性表中各个数据元素的存储结构. 线性表中所有数据元素的类型是相同的,所以每一个数据元素在存储器中占用相同的大小的空间.假 ...