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

 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. 03一些View总结

    第三天 一  TextView    父类 : View     >概念:文本控件 :文本内容的显示   默认配置不可编辑  子类EditText可以编辑          >属性:    ...

  2. ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)

    查找员工编号为7369的领导: 1 SELECT LEVEL,E.* FROM EMP E CONNECT BY PRIOR E.MGR = E.EMPNO START WITH E.EMPNO = ...

  3. J2EE进阶(二)从零开始之Struts2

    J2EE进阶(二)从零开始之Struts2 以前自己总是听说什么SSH框架,不明觉厉.现在自己要重整旗鼓,开始系统性的学习SSH框架了.首先开始Struts2的学习.其实自己之前参与过Struts2项 ...

  4. pig 的chararry类型不能用比较运算符comparison operator

    pig 的chararry类型可能是按字段,逐个字段进行比较. element_id 是chararray类型, 语句: no_app_category_mapping = filter no_ele ...

  5. 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件

    博客地址 : http://blog.csdn.net/shulianghan/article/details/41520569 代码下载 : -- GitHub : https://github.c ...

  6. 【leetcode79】Single Number III

    题目描述: 给定一个数组,里面只有两个数组,只是出现一次,其余的数字都是出现两次,找出这个两个数字,数组形式输出 原文描述: Given an array of numbers nums, in wh ...

  7. Python学习 - 输入和输出

    #输出 print('hello, python') print('The quick brown fox', 'jumps over', 'the lazy dog') #多个字符串,用逗号隔开,就 ...

  8. 查看Linux系统的平均负载

    1.Linux系统的平均负载的概念 有时候我们会觉得系统响应很慢,但是又找不到原因,这时就要查看平均负载了,看它是否有大量的进程在排队等待.特定时间间隔内运行队列中的平均进程数可以反映系统的繁忙程度, ...

  9. Process Order API - How To Scripts

    In this Document   Purpose   Questions and Answers   References APPLIES TO: Oracle Order Management ...

  10. 使用JCrop进行图片裁剪,裁剪js说明,裁剪预览,裁剪上传,裁剪设计的图片处理的工具类和代码

     1.要想制作图片裁剪功能,可以使用网上的裁剪工具JCrop,网址是:https://github.com/tapmodo/Jcrop/ 案例效果如下: 2.引入JCrop的js代码,具体要引入那 ...