静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。

在类中方法定义前添加@staticmethod,该方法就与类中的其他(属性,方法)没有关系,不能通过实例化类调用方法使用类变量,只能单纯的使用方法本身。

class dog(object):
def __init__(self,name):
self.name=name
def eat(self,food):
print '%s吃%s'%(self.name,food)
a=['q','a','z']
for i in a:
d=dog(i)
d.eat('baozi')
结果:
q吃baozi
a吃baozi
z吃baozi
class dog(object):
def __init__(self,name):
self.name=name
@staticmethod #实际跟类没有任何关系。
def eat(self,food):
print '%s吃%s'%(self.name,food)
a=['q','a','z']
for i in a:
d=dog(i)
d.eat('baozi')

结果:

Traceback (most recent call last):
File "C:\Users\xuxia\workspace\helloword\src\test\lianx_2.py", line 223, in <module>
d.eat('baozi')
TypeError: eat() takes exactly 2 arguments (1 given)

class dog(object):
def __init__(self,name):
self.name=name
@staticmethod
def eat():
print '%s吃%s'%('w','e')
d=dog('tt')
d.eat() 结果:w吃e

类方法:只能访问类变量,不能访问实例变量。

class dog(object):
name='hh'
def __init__(self,name):
self.name=name
@classmethod
def eat(self):
print '%s吃%s'%(self.name,'e')
d=dog('tt')
d.eat()
结果:hh吃e

属性方法:把一个方法变成静态属性。

class dog(object):
name='hh'
def __init__(self,name):
self.name=name
@property
def eat(self):
print '%s吃%s'%(self.name,'e')
d=dog('tt')
d.eat #
结果:tt吃e

如果给属性方法传参数,需要重新写方法,如:eat

class dog(object):
name='hh'
def __init__(self,name):
self.name=name
@property
def eat(self):
print '%s吃%s'%(self.name,'e')
@eat.setter
def eat(self,food):
print '%s is eating %s'%(self.name,food) d=dog('tt')
d.eat='baozi' 结果:tt is eating baozi

类的特殊成员方法:

ddd.py

class c(object):
def __init__(self,name):
self.name=name
def a(self):
print 'bb%s'%self.name
from ddd import c
b=c('ee')
print b.__module__

结果:ddd

print b.__class__

结果:<class 'ddd.c'>

 __call__ 对象后面加括号,触发执行

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

class dog(object):
'''方法__call__实例'''
def __init__(self,name):
self.name=name
def a(self):
print'sssss%s'%self.name
def __call__(self,*c,**f):
print c,f d=dog('ddd')
d.a()
dog('ddd')(1,2,3,f='fff') 结果:
sssssddd
(1, 2, 3) {'f': 'fff'}

__dict__ 查看类或对象中的所有成员

class dog(object):
'''方法__dict__实例'''
def __init__(self,name,food):
self.name=name
self.food=food
def a(self):
print'sssss%s'%self.name
def __call__(self,*c,**f):
print c,f print dog.__dict__
d=dog('ddd','nome')
print d.__dict__ #打印所有类属性,不包括类变量 结果:
{'a': <function a at 0x02229C70>, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'dog' objects>, '__call__': <function __call__ at 0x02229C30>, '__weakref__': <attribute '__weakref__' of 'dog' objects>, '__doc__': '\xe6\x96\xb9\xe6\xb3\x95__call__\xe5\xae\x9e\xe4\xbe\x8b', '__init__': <function __init__ at 0x02229CB0>}
{'food': 'nome', 'name': 'ddd'}

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

class dog(object):
'''方法__str__实例'''
def __init__(self,name,food):
self.name=name
self.food=food
def a(self):
print'sssss%s'%self.name
return self.name #实例化后方法的返回值,实例化后必须复制给变量
def __call__(self,*c,**f):
print c,f
def __str__(self):
return self.food #类的返回值,实例化后指对象的返回值 d=dog('xx','yy')
f=d.a()
print f
print d
结果:
sssssxx
xx
yy

__getitem__、__setitem__、__delitem__

class Foo(object):
'''__getitem__、__setitem__、__delitem__实例'''
def __getitem__(self, key):
print('__getitem__',key) def __setitem__(self, key, value):
print('__setitem__',key,value) def __delitem__(self, key):
print('__delitem__',key)
obj = Foo()
result = obj['k1'] # 自动触发执行 __getitem__
obj['k2'] = 'alex' # 自动触发执行 __setitem__
del obj['k1'] 结果:
('__getitem__', 'k1')
('__setitem__', 'k2', 'alex')
('__delitem__', 'k1')

__new__ \ __metaclass__

class Foo(object):
def __init__(self,name):
self.name = name
f = Foo("alex")

  上述代码中,f 是通过 Foo 类实例化的对象,其实,不仅 f是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象

如果按照一切事物都是对象的理论:f对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。

print type(f) # 输出:<class '__main__.Foo'>     表示,obj 对象由Foo类创建
print type(Foo) # 输出:<type 'type'> 表示,Foo类对象由 type 类创建

所以,f对象是Foo类的一个实例Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建。

那么,创建类就可以有两种方式:

a). 普通方式

class Foo(object):

    def func(self):
print 'hello alex'

b). 特殊方式

def func(self):
print 'hello wupeiqi' Foo = type('Foo',(object,), {'func': func})
#type第一个参数:类名
#type第二个参数:当前类的基类
#type第三个参数:类的成员
def f(self):
print "f"
def __init__(self,name):
self.name=name
foo=type('foo',(object,),{'__init__':__init__,'f':f}) #注意元祖object后有逗号
d=foo('xx')
d.f() 结果:f

__new__:用来创建实例的。

类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__,一般不要写__new__方法,因为该方法已经在类中写好,重写的话,只能覆盖类中的方法。

class foo(object):
def __init__(self,name):
self.name=name
print '__init__%s'%self.name
def __new__(cls,*c,**f): #先创建new方法
print '__new__'
return object.__new__(cls) #通过__new__方法创建(触发)__init__方法
f=foo('xx')
print f 结果:
__new__
__init__xx
<__main__.foo object at 0x021E51F0>

类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程

详细查看:http://www.cnblogs.com/alex3714/articles/5213184.html

python 面向对象静态方法、类方法、属性方法、类的特殊成员方法的更多相关文章

  1. python静态方法类方法属性方法

    Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问 ...

  2. Python面向对象静态方法,类方法,属性方法

    Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...

  3. python面向对象学习(六)类属性、类方法、静态方法

    目录 1. 类的结构 1.1 术语 -- 实例 1.2 类是一个特殊的对象 2. 类属性和实例属性 2.1 概念和使用 2.2 属性的获取机制 3. 类方法和静态方法 3.1 类方法 3.2 静态方法 ...

  4. Python笔记_第三篇_面向对象_8.对象属性和类属性及其动态添加属性和方法

    1. 对象属性和类属性. 我们之前接触到,在类中,我们一般都是通过构造函数的方式去写一些类的相关属性.在第一次介绍类的时候我们把一些属性写到构造函数外面并没有用到构造函数,其实当时在写的时候,就是在给 ...

  5. python 面向对象(成员,静态,类)的(变量,方法)区别

    静态方法是使用@staticmethod装饰的方法,并且参数表中不需要self或者cls,可以访问类成员变量 默认的方法是有self的,是成员方法,可以访问私有变量和方法(通过self.xxx),或者 ...

  6. python 面向对象:类方法&静态方法

    一.类方法 1.1 概念和语法说明 类方法就是针对类对象定义的方法.在类方法内部可以直接访问类属性或者调用其他的类方法 语法如下: @classmethod def 类方法名(cls): pass 说 ...

  7. Python面向对象之私有属性和私有方法

    01. 应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开的 属性 私有方法 就是 对象  ...

  8. Python实用笔记 (22)面向对象编程——实例属性和类属性

    由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(se ...

  9. Python面向对象 | 静态方法 staticmethod

    静态方法是类中的函数,不需要实例.静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作.可以理解为,静态方法是个独立的.单纯的 ...

随机推荐

  1. Mongodb数据库(linux)——基础操作

    简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.它是非关系型数据库,但其结构与MySQL又很相似,mysql中的表格,在这里被称为集合,mysql表格内的数据是一 ...

  2. 小白学习之pytorch框架(2)-动手学深度学习(begin-random.shuffle()、torch.index_select()、nn.Module、nn.Sequential())

    在这向大家推荐一本书-花书-动手学深度学习pytorch版,原书用的深度学习框架是MXNet,这个框架经过Gluon重新再封装,使用风格非常接近pytorch,但是由于pytorch越来越火,个人又比 ...

  3. Matlab高级教程_第四篇:白噪声的MATALB生成方式

    1. 白噪声主要是高斯白噪声. 2. 为什么是高斯白噪声? 高斯白噪声:1)这个噪声它是一个随机信号.2)“白”是指其功率谱的常数,这样他的自相关函数是狄拉克函数(冲激函数),由于它的自相关函数是冲激 ...

  4. C语言笔记 16_标准库&stdio&stdlib&string&time

    <stdio.h> 简介 stdio .h 头文件定义了三个变量类型.一些宏和各种函数来执行输入和输出. 库变量 下面是头文件 stdio.h 中定义的变量类型: 序号 变量 & ...

  5. xib下如何修改frame

    1.取消xib下Use Auto Layout 2.xcode->product->clean

  6. 图遍历算法的应用(包括输出长度为l的路径最短最长路径)

    判断从顶点u到v是否有路径 void ExistPath(AdjGraph* G, int u, int v, bool& has) { int w; ArcNode* p; visit[u] ...

  7. Opencv笔记(二十一)——傅里叶变换

    参考 Numpy 中的傅里叶变换 首先我们看看如何使用 Numpy 进行傅里叶变换.Numpy 中的 FFT 包可以帮助我们实现快速傅里叶变换.函数 np.fft.fft2() 可以对信号进行频率转换 ...

  8. SVN服务器的搭建(一)

    1.基本概念 1.1.什么是版本控制 简单点来说,版本控制就是数据仓库,它可以记录你对文件的每次更改.这样,就算你在昏天黑地的改了几个月后老板说不要了,还是按照过去那样,你也不会抓狂,简单的恢复版本操 ...

  9. 39)PHP,选取数据库中的两列

    首先是我的文件关系: 我的b.php是主php文件,BBB.php是配置文件,login.html是显示文件, b.php文件代码: <?php /** * Created by PhpStor ...

  10. php7 安装mongodb扩展

    下载 mongodb-1.6.0.tgz   wget https://pecl.php.net/get/mongodb-1.6.0.tgz  版本太低的话有些语法不一样,起码1.5以上吧 进入 mo ...