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

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. vue路由vue-route

    首先先引入插件 <script src="Vue.js"></script> //vue.js在前面 <script src="vue-ro ...

  2. 洛谷 2679 [NOIP 2015] 子串

    题目戳这里 一句话题意 给你两个字符串A,B从A中取出K个不重合子串(顺序与在A中顺序相同)组成B,问有多少种方案? Solution 话说重打还是出各种错误也是醉了 先看题目,因为答案与A串,B串和 ...

  3. BZOJXXXX: [IOI2000]邮局——四边形不等式优化初探

    貌似$BZOJ$上并没有这个题... 是嫌这个题水了么... 还是要氪金权限号??? 这里附上洛谷的题面:洛谷P4767 [IOI2000]邮局 题目描述 高速公路旁边有一些村庄.高速公路表示为整数轴 ...

  4. MD_STOCK_REQUIREMENTS_LIST_API 取MD04的MRP Element

    [转http://lz357502668.blog.163.com/blog/static/16496743201231941718527/]?MD_STOCK_REQUIREMENTS_LIST_A ...

  5. ubuntu android studio 编译及运行错误Error retrieving parent for item: No resource found that matches the given name

    安装好android studio并且安装其它需要的SDK或组件后,根据向导生成新的项目, 编译或运行时可能会出现下面的错误: Error:Error retrieving parent for it ...

  6. [原创]Scala学习:关于变量(val,var,类型推断)

    1.常量定义:  val val 类似于java中的final变量.一旦初始化了,val就不能再被赋值 val megs = "hello world" 2.变量的定义: var ...

  7. 第六篇 javascript面向对象

    一.闭包 闭包是指可以包含自由(未绑定到特定对象)变量的代码块. 「闭包」,是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭包是个函数,而它「记 ...

  8. TCP相关知识总结

    参考: http://coolshell.cn/articles/11564.html http://coolshell.cn/articles/11609.html TCP头格式 接下来,我们来看一 ...

  9. ConcurrentHashMap以及HashMap,HashTable的区别

    ConcurrentHashMap与HashMap,和HashTable 的区别? ConcurrentHashMap是一个线程安全的key-value数据结构,而HashMap不是.Concurre ...

  10. 大话设计模式--外观模式 Facade -- C++实现实例

    1.  外观模式: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用. 外观模式的使用场合: A: 设计初期阶段,应该要有意识的将不同的两个层分离. ...