1 静态方法

静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法。

class Dog(object):
def __init__(self, name):
self.name = name @staticmethod # 把eat方法变为静态方法
def eat(self):
print("%s is eating" % self.name) d = Dog("ChenRonghua")
d.eat()

运行结果

TypeError: eat() missing 1 required positional argument: 'self'

正确的调用结果

d = Dog("ChenRonghua")
d.eat() #不能识别类的实例变量

2 类方法

类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。

class Dog(object):
def __init__(self,name):
self.name = name @classmethod
def eat(self):
print("%s is eating" % self.name) d = Dog("ChenRonghua")
d.eat()

运行报错

AttributeError: type object 'Dog' has no attribute 'name'

因为name是实例变量,所以不能访问。

class Dog(object):
name = "ddddd"
def __init__(self,name):
self.name = name

这样就可以正常调用了。

3 属性方法

属性方法的作用就是通过@property把一个方法变成一个静态属性

class Dog(object):

    def __init__(self,name):
self.name = name @property
def eat(self):
print(" %s is eating" %self.name) d = Dog("ChenRonghua")
d.eat()

运行报错

TypeError: 'NoneType' object is not callable

d = Dog("ChenRonghua")
d.eat

运行没有错误

ChenRonghua is eating

4 类的特殊成员

1.doc 类的描述信息

class Test():

"""这是类的描述信息"""

pass

a=Test().doc

print(a)

运行结果

这是类的描述信息

2.moduleclass

module 表示当前操作的对象在那个模块

class 表示当前操作的对象的类是什么

3. init 构造方法,通过类创建对象时,自动触发执行。

4.del 析构方法,当对象在内存中被释放时,自动触发执行。

5.call 对象后面加括号,触发执行。

构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

6.dict 查看类或对象中的所有成员

7.str 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Foo(object):
def __getitem__(self, key): (1)
print('__getitem__', key) (1) def __setitem__(self, key, value): (2)
print('__setitem__', key, value) (2) def __delitem__(self, key): (3)
print('__delitem__', key) (3) obj = Foo() result = obj["k1"]

运行结果

执行(1):getitem k1

obj['k2'] = 'alex'

运行结果

执行(2):setitem k2 alex

__setitem__ k2 alex

运行结果

执行(3):delitem k1

9. new \ metaclass

通过type的方式创建类

def func(self):

print 'hello wupeiqi'

Foo = type('Foo',(object,), {'func': func})
#type第一个参数:类名
#type第二个参数:当前类的基类
#type第三个参数:类的成员

5 类的创建过程和实例化过程

class MyType(type):

    def __init__(self, what, bases=None, dict=None):(2)
print("--MyType init---")
super(MyType, self).__init__(what, bases, dict) def __call__(self, *args, **kwargs): (4)
print("--MyType call---")
obj = self.__new__(self, *args, **kwargs)(5) self.__init__(obj, *args, **kwargs)(7) class Foo(object): __metaclass__ = MyType (1) def __init__(self, name): (8)
self.name = name
print("Foo ---init__") def __new__(cls, *args, **kwargs):(6)
print("Foo --new--")
return object.__new__(cls) # 第一阶段:解释器从上到下执行代码创建Foo类
# 第二阶段:通过Foo类创建obj对象
obj = Foo("Alex") (3)

1.正常情况下,如果没有__metaclass__的话,就会寻找父类,如果父类也没有__metaclass__,就会使用内置的type创建类对象,但是这里是指定了MyType来创建类。

2.(2)创建Foo类 然后到(3)需要Foo类实例化。

3.(4)开始进行实例化的创建。

4.(5)通过__new__实例化出Foo对象,会得到一个Foo的实例对象地址。

5.通过(5)调用了(6)返回一个Foo实例对象地址。

6.(7)进行__init__初始化,调用了(8),到现在Foo()实例化完成。

6 反射 hasattr、getattr、setattr和delattr

hasattr

检查是否含有成员或方法

class Foo(object):
def __init__(self, name):
self.name = name def eat(self):
print("%s eating" % self.name )
return "eat"
obj = Foo("xiaoming") print(hasattr(obj, "__module__"))
print(hasattr(obj, "name"))

getattr

获取成员的值 getattr(object, name, default=None)

print(getattr(obj, "name","meiyoua"))

如果有就打印name的值,没有就打印meiyoua

setattr

添加成员

setattr(obj,"age","18")

delattr

删除成员

delattr(obj,"name")
print(obj.name)

报错

print(obj.name)

AttributeError: 'Foo' object has no attribute 'name'

Python自动化之面向对象进阶的更多相关文章

  1. 周末班:Python基础之面向对象进阶

    面向对象进阶 类型判断 issubclass 首先,我们先看issubclass() 这个内置函数可以帮我们判断x类是否是y类型的子类. class Base: pass class Foo(Base ...

  2. Python中级 —— 01面向对象进阶

    面向对象进阶 总结.补充(http://blog.csdn.net/fgf00/article/details/52479307) 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 ...

  3. Python学习之面向对象进阶

    面向对象进阶当然是要谈谈面向对象的三大特性:封装.继承.多态 @property装饰器 python虽然不建议把属性和方法都设为私有的,但是完全暴露给外界也不好,这样,我们给属性赋值的有效性九无法保证 ...

  4. Python之路【第六篇】python基础 之面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象  和  issubclass(su ...

  5. python学习总结(面向对象进阶)

    -------------------类属性和实例属性关系------------------- 1.类属性和实例属性关系     1.实例属性         实例对象独有的属性     2.类属性 ...

  6. Python基础之面向对象进阶一

    一.isinstance(obj,cls)和issubclass(sub,super) 1.isinstance(obj,cls)检查obj是否是类 cls 的对象 class A: pass obj ...

  7. Python自动化开发 - 面向对象(二)

    本节内容 1.isinstance(obj,cls)和issubclass(sub,super) 2.反射 3.__setattr__,__delattr__,__getattr__ 一. isins ...

  8. Python自动化开发 - 面向对象(一)

    本节内容 1.编程范式 面向过程编程 面向对象编程 2.面向对象编程介绍 类的语法 类与实例内存分配 构造方法 自定义方法 3.面向对象特性 一.编程范式 编程是程序员 用特定的语法+数据结构+算法组 ...

  9. python之路----面向对象进阶一

    一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() i ...

随机推荐

  1. ArcGIS Server 10.1 for Linux典型问题总结

    关闭开启server服务: [gis@localhost ArcGISServer]$ cd /home/gis/arcgis/server [gis@localhost server]$ ./sto ...

  2. Java多线程——线程范围内共享变量

    多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...

  3. macbook pro的usb串口失效的的处理方法

    macbook pro的usb串口失效的的处理方法 2011-08-24 12:14:32|  分类: mac|举报|字号 订阅     今天开电脑,无端端一个usb的串口失效了,接入鼠标 iphon ...

  4. Webpack 之 Loader 的使用

    安装 loaders 如果loader在npm里,可以这样安装: $ npm install xxx-loader --save 或者 $ npm install xxx-loader --save- ...

  5. ctrl+c,ctrl+d,ctrl+z在linux中意义

    ctrl+c,ctrl+d,ctrl+z在linux中意义   ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.   ctrl+c是强制中断程序的执行.   ctrl+z的是将任务中断 ...

  6. java设计模式设计模式

    JAVA设计模式之单例模式   概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一 ...

  7. mapreduce 自定义数据类型的简单的应用

    本文以手机流量统计为例: 日志中包含下面字段 现在需要统计手机的上行数据包,下行数据包,上行总流量,下行总流量. 分析:可以以手机号为key 以上4个字段为value传传递数据. 这样则需要自己定义一 ...

  8. Java字节流:InputStream OutputStream

    字节输入流:InputStream 类声明: public abstract class InputStream implements Closeable 位于java.io包下,是一个抽象类. 官方 ...

  9. 一个简单的html5页面在线速成工具!(当然本文主要说下他的成果的结构)

    分享一个好玩的web app页面速成工具 当然主要是让大家看下他的原理 看着他的结构大家就该猜到这个了.这个是利用换页之后给当前div加了一个active,然后利用css控制效果 这个毫无疑问是采用最 ...

  10. getStyle(),修改样式属性

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...