实例方法、类方法、静态方法

class MyClass(object):

    class_name = "MyClass"  # 类属性, 三种方法都能调用

    def __init__(self):
self.instance_name = "instance_name" # 实例属性, 只能被实例方法调用
self.class_name = "instance_class_name" def get_class_name_instancemethod(self): # 实例方法, 只能通过实例调用
# 实例方法可以访问类属性、实例属性
return MyClass.class_name @classmethod
def get_class_name_classmethod(cls): # 类方法, 可通过类名.方法名直接调用
# 类方法可以访问类属性,不能访问实例属性
return cls.class_name @staticmethod
def get_class_name_staticmethod(): # 静态方法, 可通过类名.方法名直接调用
# 静态方法可以访问类属性,不能访问实例属性
return MyClass.class_name def instance_visit_class_attribute(self):
# 实例属性与类属性重名时,self.class_name优先访问实例属性
print "实例属性与类属性重名时,优先访问实例属性"
print "self.class_name:", self.class_name
print "MyClass.name:", MyClass.class_name if __name__ == "__main__":
MyClass.class_name = "MyClassNew"
intance_class = MyClass()
print "instance method:", intance_class.get_class_name_instancemethod()
print "class method:", MyClass.get_class_name_classmethod()
print "static method:", MyClass.get_class_name_staticmethod()
intance_class.instance_visit_class_attribute()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

执行效果

instance method: MyClassNew
class method: MyClassNew
static method: MyClassNew
实例属性与类属性重名时,优先访问实例属性
self.class_name: instance_class_name
MyClass.name: MyClassNew
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2. 区别

  1. 实例方法

    属于实例的方法 
    只能通过实例名.方法名调用。 
    其可以访问类属性、实例属性,类方法、实例方法、静态方法。

  2. 类方法

    属于类类的方法 
    可以通过实例名.方法名,也可以类名.方法名 
    其不能访问实例属性和实例方法

  3. 静态方法

    和类方法很相似,不同的时候定义时要定义(cls)参数 
    可以通过实例名.方法名,也可以类名.方法名 
    其不能访问实例属性和实例方法

3. 静态方法与类方法

这两者非常像,都是源于C++或JAVA中static的思想。不过我觉得,python的静态方法是从c++和java进化时的一个不完全产物。尽量使用类方法,不使用静态方法。

python的实例属性、类属性对应c++或java中的非静态属性和静态属性 
python的实例方法、类方法对应c++或java中的非静态方法和静态方法

下面是一个类方法比静态方法牛逼的地方

class Color(object):
_color = (0, 0, 0); @classmethod
def value(cls):
if cls.__name__== 'Red':
cls._color = (255, 0, 0) elif cls.__name__ == 'Green':
cls._color = (0, 255, 0) return cls._color class Red(Color):
pass class Green(Color):
pass class UnknownColor(Color):
pass red = Red()
green = Green()
xcolor = UnknownColor() print 'red = ', red.value()
print 'green = ', green.value()
print 'xcolor =', xcolor.value()

Python Class 的实例方法/类方法/静态方法的更多相关文章

  1. python中的实例方法、静态方法、类方法、类变量和实例变量

    class MyTest: myname = 'peter' # add a instance attribute    def __init__(self, name):        self.n ...

  2. Python的实例方法,类方法,静态方法之间的区别及调用关系

    如果只看这个图,很多人可能会看的一头雾水,特别是学过完全面向对象语言的同学, Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是 ...

  3. Python - 面向对象编程 - 实例方法、静态方法、类方法

    实例方法 在类中定义的方法默认都是实例方法,前面几篇文章已经大量使用到实例方法 实例方法栗子 class PoloBlog: def __init__(self, name, age): print( ...

  4. python中实例方法,类方法,静态方法简单理解

    按照字面名称来理解的话: 实例方法就是实例化对象的方法,绑定在实例对象上 类方法就是类自己的方法,不需要实例化对象,类自己就是对象,直接绑定在类上 静态方法就是普通的函数,函数作为对象,不过是封装在类 ...

  5. python类的实例方法、静态方法和类方法区别及其应用场景

    https://blog.csdn.net/helloxiaozhe/article/details/79940321 普通实例方法,第一个参数需要是self,它表示一个具体的实例本身. 如果用了st ...

  6. Python面向对象之类属性类方法静态方法

    类的结构 实例 使用面向对象开发时,第一步是设计类: 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象: 2.为对象的属性 设置初始值--初始化方法(init ...

  7. 面向对象~~类的成员: 私有成员,公有成员, 实例方法, 类方法, 静态方法, 属性(property), isinstance ,issubclass, 元类(type)

    一 私有成员公有成员 公有成员: 在任何地方都能访问 私有成员: 只有在类的内部才能访问 类从加载时,只要遇到类中的私有成员,都会在私有成员前面加上_类名 二 实例方法 实例方法就是类的实例能够使用的 ...

  8. Python绑定方法,未绑定方法,类方法,实例方法,静态方法

    >>> class foo(): clssvar=[1,2] def __init__(self): self.instance=[1,2,3] def hehe(self): pr ...

  9. 关于python的类方法、实例方法和静态方法区别

    python的类方法需要在方法前面加装饰器:@classmethod ,静态方法是在方法前面加装饰器:@staticmethod. 类方法.类属性是属于类自身,属于类自身的命名空间,和实例方法.实例属 ...

随机推荐

  1. spring工作原理理解

    spring的工作原理 spring是作为一个容器存在的框架,可以加载spring web,spring mvc,spring orm,sprong aop,spring dao等框架和模块,其主要核 ...

  2. 【BZOJ4028】[HEOI2015]公约数数列 分块

    [BZOJ4028][HEOI2015]公约数数列 Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. M ...

  3. 【BZOJ5016】[Snoi2017]一个简单的询问 莫队

    [BZOJ5016][Snoi2017]一个简单的询问 Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计 ...

  4. Collect More Jewels(hdu1044)(BFS+DFS)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  5. 我为什么选择采用node.js来做新一代的EasyDarwin RTSP开源流媒体服务器

    在去年我们还未开始开发基于node.js的新版本EasyDarwin RTSP开源流媒体服务器的时候,我写了一篇博客<对EasyDarwin开源项目后续发展的思考:站在巨人的肩膀上再跳上另一个更 ...

  6. android菜鸟学习笔记21----ContentProvider(一)ContentProvider的简单使用

    ContentProvider是Android四大组件之一,它用来封装数据,并通过ContentResolver接口将数据提供给其他应用.只有当需要在多个应用之间共享数据时才会用到ContentPro ...

  7. Java中List.remove报UnsupportedOperationException异常

    今天项目中有个需求场景: A和B都是List,而B是A的子集,现在想求A和B的差集. 想到了List中提供的removeAll()方法可以求得差集,但是结果确报了UnsupportedOperatio ...

  8. SE16传输配置表数据

    SE16标准工具传输配置表数据 (上面说了配置表,所以并不是所有的表都能SE16传输.) 了解到: 1.如果是可维护的表,SE16,执行 然后:表条目->传输条目.选择请求: 2.对于不可维护的 ...

  9. Android SDK上手指南 3:用户交互

    在这篇教程中,我们将对之前所添加的Button元素进行设置以实现对用户点击的检测与响应.为了达成这一目标,我们需要在应用程序的主Activity类中略微涉及Java编程内容.如果大家在Java开发方面 ...

  10. js常用方法(。。。。不完整)

    lastIndexOf();substring();split();slice();splice(); var s="http://www.baidu.com"; var unit ...