python---面向对象高级进阶
静态方法,调用静态方法后,该方法将无法访问类变量和实例变量
class Dog(object):
def __init__(self,name):
self.name = name def eat(self,food):
print("%s is eating %s"%(self.name,food)) d = Dog("Jack")
d.eat("banana") #静态方法写法
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod #静态类后,则无法调用类变量和实例变量
def eat(self): #需要传进来的是实例了,而不能调用类本身的属性
print("%s is eating %s"%(self.name,"banana")) d = Dog("Alex")
d.eat(d) #传入实例化后的一个实例
类方法,类方法后,可以访问类变量,但无法访问实例变量
class Dog(object):
name = "Mark"
def __init__(self,name):
self.name = name
@classmethod
def eat(self):
print("%s is eating %s"%(self.name,"banana")) #name为类变量,而非实例变量 d = Dog("Alex")
d.eat()
#运行结果:Mark is eating banana
属性方法,@property 调用属性方法后,该方法将是静态属性,调用不需要加(),直接调用即可
class Dog(object):
def __init__(self,name):
self.name = name
self.__food = None
@property
def eat(self):
print("%s is eating %s"%(self.name,"banana"))
@eat.setter
def eat(self,food):
print("set food:",food)
self.__food = food d = Dog("Alex")
d.eat #属性方法输出的是属性,不需要动态调用,即不需要d.eat()
属性方法修改,删除
class Dog(object):
def __init__(self,name):
self.name = name
self.__food = None
@property
def eat(self):
print("%s is eating %s"%(self.name,self.__food))
@eat.setter
def eat(self,food): #修改属性方法的参数
print("set food:",food)
self.__food = food
@eat.deleter #删除属性方法的参数
def eat(self):
del self.__food
print("deleted!!!!!") d = Dog("Mark")
d.eat
d.eat = "apple" #向属性方法种传递参数
d.eat
del d.eat #删除属性方法种的参数
d.eat
__metaclass__,__init___,__call__,__new__方法调用
# -*- coding:utf-8 -*-
# LC class MyType(type):
def __init__(self,*args,**kwargs):
print("Mytype init",args,kwargs)
def __call__(self, *args, **kwargs):
print("Mytype call",args,kwargs)
obj = self.__new__(self)
self.__init__(obj,args,kwargs) class Foo(object):
__metaclass__ = MyType #表示该类是由谁来实例化自己的(即Foo类)
def __init__(self):
print("foo init")
def __new__(cls, *args, **kwargs):
print("foo new")
return object.__new__(cls) f = Foo()
#在python2或者3中,执行顺序为:__new__ , __init__, __call__、
#__new__优于__init__执行
#__call__用于创建__new__

反射,类的反射
class Dog(object):
def __init__(self,name):
self.name = name def eat(self):
print("%s is eating"%self.name) def bulk(self):
print("%s is yelling"%self.name) d = Dog("Jack") choice = input(">>:").strip()
print(hasattr(d,choice)) #表示对象中是否含有choice的属性,包含变量,方法等 if hasattr(d,choice):
print(getattr(d,choice)) #获取对象中的choice属性,如果是变量,则获取变量值,如果是方法,可以通过加()进行执行
getattr(d,choice)()
else:
setattr(d,choice,bulk) #设置对象中的choice属性,如可以新增一个变量或方法
getattr(d,choice)(d) #func = get(d,choice), func(d)
d.talk(d) delattr(d,choice) #删除对象中的choice属性,可以是变量,也可以是方法
d.talk(d)
类的特殊方法:
# -*- coding:utf-8 -*-
# LC #__doc__ 输出类的描述信息
class Foo:
'''
类的描述信息
'''
def func(self):
pass print(Foo.__doc__) #__module__ 输出当前操作的对象在那个模块
#__class__ 输出当前操作的对象的类是什么 from lib.aa import C
obj = C()
print(obj.__module__)
print(obj.__class__) #__call__ 对象后加括号,触发执行
#构造方法的执行是由创建对象触发的,即:对象=类名();而对于__call__方法的执行是由对象加括号触发的,即对象()或类()()
class Dog(object):
def __init__(self,name):
self.name = name def __call__(self, *args, **kwargs):
print("%s running call"%self.name,args,kwargs) obj2 = Dog("alex")
obj2("wawawa",sex="F") #__dict__ 查看类或者对象中的成员 print(Dog.__dict__)
print(obj2.__dict__) #__str__ 如果一个类中定义了__str__方法,则在打印对象的时候,默认输出该方法(__str__)的值
class Cat(object):
def __str__(self):
return "str method" obj3 = Cat()
print(obj3) #__getitem__,__setitem__,__delitem__ 用于索引操作,如字典,分别进行获取,设置,删除数据 class apple(object):
def __init__(self):
self.data = {}
def __getitem__(self, key):
print("get apple %s"%key)
return self.data.get(key)
def __setitem__(self, key, value):
print("setting apple,%s,%s"%(key,value))
self.data[key] = value
def __delitem__(self, key):
print("deleting apple %s"%key)
del self.data[key] obj4 = apple()
obj4["apple1"] = "red"
obj4["apple2"] = "green" res = obj4["apple1"]
print('---',res)
print(obj4.data)
del obj4["apple1"]
res = obj4["apple2"] #删除后则没有了。输出为None,具体是否删除,也是由__delitem__方法定义的
print('---',res) #__new__
class Foo(object):
def __init__(self,name):
self.name = name f = Foo("Jack")
print(type(f))
print(type(Foo))
异常处理
names = ["Alex","Jack"]
dict = {} try:
names[3]
except IndexError as e: #抓具体的错误类型
print("ERROR !!!",e) try:
names[3]
except Exception as e: #包含所有的错误类型,不建议使用,建议使用在最后抓未知错误
print("ERROR !!!",e) try:
dict["age"]
except KeyError as e: #抓具体的错误类型
print("ERROR !!!",e) try:
#dict["age"]
#names[3]
print(names[3])
except (IndexError,KeyError) as e: #抓取两个错误中的任意一个,代码谁先出错则执行谁
print("ERROR",e)
else: #没有错的时候执行
print("all is well") finally: #不管有没有错,都执行
print("不管有你没有错,都执行") class TestException(Exception): #自定义异常
def __init__(self,msg):
self.msg = msg try:
raise TestException('自定义异常')
except TestException as e:
print(e)
断言,即是一种简单的判断,如果是True,则通过,如果是Fasle,则报错。
assert type(obj.name) is int
python---面向对象高级进阶的更多相关文章
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- 【转】python 面向对象(进阶篇)
[转]python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 ...
- python 面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python 面向对象高级应用(三)
目录: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__getattr__ 二次加工标准类型(包装) __ ...
- python 面向对象(进阶篇)转载武沛齐
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- Python学习笔记【第十一篇】:Python面向对象高级
isinstance(obj,cls)和issubclass(sub,super) class Person(object): def __init__(self, name, age, sex, n ...
- python面向对象高级:Mixin多重继承
继上一篇学习笔记:python面向对象的继承与多态,本篇就Mixin扩展类的方法写下学习笔记 Mixin Mixin编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是 ...
- Python之路【第十二篇】:Python面向对象高级
一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究 ...
- 【Python之路】特别篇--Python面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- Python之路,Day8 - Python基础 面向对象高级进阶与socket基础
类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...
随机推荐
- 定制Maven原型生成项目
1自定义原型 1.1创建原型项目 要定制自己的原型,首先就要创建原型项目来进行定制: mvnarchetype:create -DgroupId=com.cdai.arche -DartifactId ...
- [rrdtool]监控和自动画图,简单的监控.md
现在想要监控服务的流量和并发数,可是又没那么多时间来写系统,其他的运维系统又不熟悉,于是就用现有的rrdtool shell做了个简单的监控界面,临时用下,也算是个小实验把. rrdtool也是刚接触 ...
- RTB--Real TimeBidding模式的互联网广告(实时竞价的广告投放)
RTB(real time bidding)实时竞价允许广告买家根据活动目标.目标人群以及费用门槛等因素对每一个广告及每次广告展示的费用进行竞价.竞价成功后获得广告展示机会,在展示位置上展示广告. 其 ...
- Hadoop-1.0.4伪分布安装与配置
1.采用伪分布模式安装 将hadoop-****.tar.gz复制到linux的/usr/local目录下. 2.解压,重命名 #tar -xzvf hadoop-1.0.4.ta ...
- Oracle PL/SQL Articles
我是搬运工....http://www.oracle-base.com/articles/plsql/articles-plsql.php Oracle 8i Oracle 9i Oracle 10g ...
- polaris: 一个用go实现的支持restful的web框架
介绍 polaris是一个用go实现的支持restful的web框架,主要参考tornado进行设计. 虽然在go里面搭建一个http server非常的简单,这里强烈推荐gorilla,但并没有很好 ...
- sublime text (ST)一篇通(安装、配置、扩展、使用)
sublime编辑器,功能插件多,可以扩展为IDE------------------------------------------- 1.安装 官网下载 http://www.sublimete ...
- Leetcode_49_Anagrams
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42744709 Given an array of stri ...
- 省市联动 纯html+js
在js里面声明所有数据,并根据html的select事件触发js实现填充对应的数据到下拉框. 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...