静态方法,调用静态方法后,该方法将无法访问类变量和实例变量

 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---面向对象高级进阶的更多相关文章

  1. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  2. 【转】python 面向对象(进阶篇)

    [转]python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 ...

  3. python 面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  4. python 面向对象高级应用(三)

    目录: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__getattr__ 二次加工标准类型(包装) __ ...

  5. python 面向对象(进阶篇)转载武沛齐

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  6. Python学习笔记【第十一篇】:Python面向对象高级

    isinstance(obj,cls)和issubclass(sub,super) class Person(object): def __init__(self, name, age, sex, n ...

  7. python面向对象高级:Mixin多重继承

    继上一篇学习笔记:python面向对象的继承与多态,本篇就Mixin扩展类的方法写下学习笔记 Mixin Mixin编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是 ...

  8. Python之路【第十二篇】:Python面向对象高级

    一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究 ...

  9. 【Python之路】特别篇--Python面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  10. Python之路,Day8 - Python基础 面向对象高级进阶与socket基础

    类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...

随机推荐

  1. oracle 选取出现次数最多的前5条数据

    SELECT * FROM ( SELECT PROJECT_LISTING.MATERIAL, COUNT (*) AS "出现次数" FROM PROJECT_LISTING ...

  2. Android(Lollipop/5.0) Material Design(二) 入门指南

    Material Design系列 Android(Lollipop/5.0)Material Design(一) 简介 Android(Lollipop/5.0)Material Design(二) ...

  3. UICollectionView请求网络数据显示(Text)

    TEXT: AppDelegate.m self.window.rootViewController = [[[UINavigationController alloc]initWithRootVie ...

  4. 2015&nbsp;Objective-C&nbsp;三大新特性

    Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时,也有很多像我一样工作上依然 ...

  5. Linux信号实践(2) --信号分类

    信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号 ...

  6. Touch Handling in Cocos2D 3.x(五)

    实现新英雄的放置功能 首先我们需要一个变量来保持我们当前移动英雄的引用,因此我们将添加一个私有实例变量.修改MainScene.m中的代码. 用: @implementation MainScene ...

  7. 20_Android中apk安装器,通过WebView来load进一个页面,Android通知,程序退出自动杀死进程,通过输入包名的方式杀死进程

     场景:实现安装一个apk应用程序的过程.界面如下: 编写如下应用,应用结构如下: <RelativeLayout   编写activity_main.xml布局: <Relative ...

  8. mysql进阶(二十)CPU超负荷异常情况

    CPU超负荷异常情况 问题 项目部署阶段,提交订单时总是出现cpu超负荷工作情况,导致机器卡死,订单提交失败.通过任务管理器可见下图所示: 通过任务管理器中进程信息(见下图)进行查看,可见正是由于项目 ...

  9. BDA大数据处理流程

    可以看出,数据处理用云,可以高效完成.而分析部分应该利用传统的bi工具.

  10. /dev/null 2>&1的意思(可以直接参考shell重定向那篇,/dev/null是空设备)

    路还长 别太狂 以后指不定谁辉煌 2>&1 和 &> 的解释 Linux的IO输入输出有三类 Standard Input 代码 0 Standard Output 代码 ...