python实例方法、类方法和静态方法
在说这些之前先说一下什么是实例变量、类变量和全局变量。
实例变量(实例属性)
对象.实例变量名 = 表达式 (“asd”,2) #创建或者修改变量
v = 对象(实例).实例变量名 #属性的取值操作
del 删除实例变量:
del 对象.属性名
预置的实例变量:
dict 属性字典 绑定的是一个字典,存储的方式是 key-value 一对键值对
class 返回创建此实例的类
type 同class
类变量(类属性)
类变量是类的属性,此属性属于类,不属于类的实例
作用:
通常用来存储此类创建的对象的共有的属性
说明:
1、类变量可以通过类直接访问
2、类变量可以通过类的实例直接访问
3、类变量可以通过此类的__class__属性间接去访问
e.g
class Dog:
color = “白色”
def init(self):
pass
d = Dog()
print(Dog.color) #通过类名直接访问
print(d.color) #通过对象去访问类变量
print(d.class.color) #通过__class__间接去访问
类方法:
@classmethod
类方法是用于描述类的行为的方法,类方法属于类,但不属于该类创建的对象
说明:
1、类方法需要用到 @classmethod
2、类方法至少有一个形参,第一个形参用于绑定类,约定写为’cls’
3、类和该类的实例都可以调用类方法
4、类方法不能访问此类创建的对象的实例属性
class Dog:
@classmethod
def fun(cls, s):
print("%s" % s)
d = Dog()
d.fun(“实例调用的”)
Dog.fun(“类调用的”)
静态方法:
静态方法是定义在类内部的函数,此函数的作用域是类的内部
说明:
1、静态方法需要使用 @staticmethod
2、静态方法与普通函数定义相同,不需要传入self实例参数和 cls 参数
3、静态方法只能凭借该类或者该类创建的对象来调用
4、静态方法不可以访问类变量和实例变量
class Dog:
“”“这是一个狗类,这里面全是小白狗”""
@staticmethod
def fun(name):
print(“这是一个静态方法”)
d = Dog()
d.color = “red”
d.fun()
Dog.fun()
关于三种方法的使用,有一些要注意的地方:
实例方法、类方法、静态方法、函数
1、实例方法能访问实例变量,类变量和全局变量
2、类方法不能访问实例变量,但是能访问类变量和全局变量
3、静态方法不能放问实例变量,类变量,但是能访问全局变量
4、函数只能访问全局变量
下面举个例子:
class A():
global sex
name="小明"
age=16
def fun(self,age,name,sex):
print("这是一个实例方法%s 姓名%s 性别%s" % (age,self.name,sex))
@classmethod
def fun1(cls,name,sex):
print("这是一个类方法%s 性别%s" % (cls.name,sex))
@staticmethod
def fun2(name,sex):
print("这是一个静态方法%s 性别%s" % (name,sex))
sex=2
a=A()
a.age=18 #修改了这个实例对应的变量的值,修改的值只是这个对象对应的值,而不会改变类变量本身的值
a.fun(a.age,123,sex) #这里age传入的是一个数值,name传的是类变量,所以无论你写什么传入的仍是类本身定义的变量,如果fun函数把self给去掉,则传入的就是数值了
a.fun(81,a.name,sex) #这里age传入的是实例变量,sex是全局变量
b=A()
b.fun1(123,sex) #这里可以传入类变量和全局变量,如果传入的是实例变量则运行不了
c=A()
c.fun2(123,sex) #这里name只能传入数值,但是能传入全局变量
输出结果是:
以上就是我对这三种方法的理解!!!