Python初学之类的方法
2017-08-02 18:23
543 查看
实例对象的公有方法和私有方法:公有方法通过对象名直接调用,私有方法不可以,只能在属于对象的方法中通过self调用,或者在外部通过Python支持的特殊方法调用。如果通过类名来调用时属于对象的公有方法,需要显示地为该方法的self参数传递一个对象名,用来明确指定访问那个对象的数据成员。静态方法和类方法都可以通过对象名和类名调用,但不能直接访问属于对象的数据成员,只能访问属于类的成员。一般用cls作为类方法 的第一个参数名称,但是也可以使用其他的名字作为参数,并且调用类方法时不需要为改参数传递值。
在构造函数中,程序对公有变量设置了初始值(初始化),可以在构造函数中使用参数,通常使用参数来设置成员变量(特别是私有变量)的值。
术语解释:实例变量 = 实例属性=实例对象的属性 = 成员变量 ;类变量 = 类属性
(1)静态方法
静态方法无须传入self参数,因此静态方法无法访问实例变量;静态方法中不可以直接访问类的静态变量,但可以通过类名引用静态变量。
所以静态方法与定义它的类没有直接关系,类似函数工具库。可以通过类和实例对象访问静态方法,二者无区别。
(2)类方法
类方法有一个cls参数,代表定义类方法的类,可以通过cls访问类的静态变量。
class myclass:
vall = 'string'
def __init__(self):
self.a1 = 'a'
@classmethod
def classmd(cls):
print str(cls),cls.vall#无法访问a1的值
myclass.classmd()
c = mylass()
c.classmd()
class Root:
__root = 0
def __init__(self,a):
self.__a = a
Root.__root +=1
def show(self):
print self.__a,self.__root
@classmethod
def classmd(cls):
print cls.__root#类方法
@staticmethod
def staticmd():
print Root.__root#静态方法
结果如下:
>>> r = Root(1)#创建实例对象r
>>> r.classmd()#通过对象名调用类方法
1
>>> r.staticmd()#通过对象名调用静态方法
1
>>> r.show()#通过对象名调用实例对象方法
1 1
>>> Root.classmd()#通过类名调用类方法
1
>>> Root.staticmd()#通过类名调用静态方法
1
>>> Root.show()#试图调用实例对象方法,失败。
Traceback (most recent call last):
File "<pyshell#160>", line 1, in <module>
Root.show()
TypeError: unbound
4000
method show() must be called with Root instance as first argument (got nothing instead)
>>> Root.show(r)#通过类名调用势力对象方法时为self显示传对象名。
1 1
>>> r.show()
1 1
>>> rr = Root()
Traceback (most recent call last):
File "<pyshell#163>", line 1, in <module>
rr = Root()
TypeError: __init__() takes exactly 2 arguments (1 given)
>>> rr = Root(4)
>>> r.show()
1 2
>>> rrr = Root(5)
>>> r.show()
1 3
>>> Root.show(rr)
4 3
>>> Root.show(rrr)
5 3
在构造函数中,程序对公有变量设置了初始值(初始化),可以在构造函数中使用参数,通常使用参数来设置成员变量(特别是私有变量)的值。
术语解释:实例变量 = 实例属性=实例对象的属性 = 成员变量 ;类变量 = 类属性
(1)静态方法
静态方法无须传入self参数,因此静态方法无法访问实例变量;静态方法中不可以直接访问类的静态变量,但可以通过类名引用静态变量。
所以静态方法与定义它的类没有直接关系,类似函数工具库。可以通过类和实例对象访问静态方法,二者无区别。
(2)类方法
类方法有一个cls参数,代表定义类方法的类,可以通过cls访问类的静态变量。
class myclass:
vall = 'string'
def __init__(self):
self.a1 = 'a'
@classmethod
def classmd(cls):
print str(cls),cls.vall#无法访问a1的值
myclass.classmd()
c = mylass()
c.classmd()
class Root:
__root = 0
def __init__(self,a):
self.__a = a
Root.__root +=1
def show(self):
print self.__a,self.__root
@classmethod
def classmd(cls):
print cls.__root#类方法
@staticmethod
def staticmd():
print Root.__root#静态方法
结果如下:
>>> r = Root(1)#创建实例对象r
>>> r.classmd()#通过对象名调用类方法
1
>>> r.staticmd()#通过对象名调用静态方法
1
>>> r.show()#通过对象名调用实例对象方法
1 1
>>> Root.classmd()#通过类名调用类方法
1
>>> Root.staticmd()#通过类名调用静态方法
1
>>> Root.show()#试图调用实例对象方法,失败。
Traceback (most recent call last):
File "<pyshell#160>", line 1, in <module>
Root.show()
TypeError: unbound
4000
method show() must be called with Root instance as first argument (got nothing instead)
>>> Root.show(r)#通过类名调用势力对象方法时为self显示传对象名。
1 1
>>> r.show()
1 1
>>> rr = Root()
Traceback (most recent call last):
File "<pyshell#163>", line 1, in <module>
rr = Root()
TypeError: __init__() takes exactly 2 arguments (1 given)
>>> rr = Root(4)
>>> r.show()
1 2
>>> rrr = Root(5)
>>> r.show()
1 3
>>> Root.show(rr)
4 3
>>> Root.show(rrr)
5 3
相关文章推荐
- python类、对象、方法、属性之类与对象
- Python初学之类的继承和多态
- python进阶之类常用魔法方法和魔法属性
- python类、对象、方法、属性之类与对象笔记
- python之类方法和静态方法
- python类、对象、方法、属性之类与对象笔记
- 【转】python类、对象、方法、属性之类与对象笔记
- 初学python之练习将输入的数字进行排序的方法
- python类、对象、方法、属性之类与对象笔记
- python基础教程之类class定义使用方法
- 【转】python类、对象、方法、属性之类与对象笔记
- python3学习之类成员、扩展父类方法的功能
- python初学 简单随机数方法及流程控制
- python初学 类方法 实例方法 静态
- Python初学笔记-类中的方法
- python基础教程之类class定义使用方法
- python学习之类特殊方法定制 __add__,__iadd__,__radd__
- python之类方法的重载
- python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
- Python初学之类的狭义属性(@property)