类和实例
实例方法 实例变量
实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,也叫做成员变量。
class A:
name = 'kobe'
def __init__(self,name):
self.name = name
a=A('jordan')
print(a.name) #jordan 实例属性
del(a.name) #删除的也是实例属性
print(a.name) #kobe 类属性 实例也可以直接使用类属性,只是不推荐
del(a.name)#删除类属性
print(a.name) #没有name属性
实例方法:在类中声明的带self方法,例如:My(self),必须实例化之后才可以使用,否则会报错。
class Foo:
no = 100
def __init__(self, name):
self.name = name
def ord_func(self):
print(self.name)#调用实例变量
print(self.no)#实例也可以调用类变量,但是建议只使用类名.类变量的调用方式
self.cls_func()#实例也可以调用类方法,但是建议只使用类名.类方法的调用方式
self.static_func()#实例也可以调用静态方法,但是建议只使用类名.静态方法的调用方式
@classmethod
def cls_func(cls):
print('这是类方法')
@staticmethod
def static_func():
print('这是一个静态方法')
if __name__ == "__main__":
a=Foo('Jack')
a.ord_func()#调用实例方法
类方法 类变量
类变量:类变量是所有实例公有的变量,每一个实例都可以访问,也可以通过类名直接访问 A.name
类方法:@classmethod
class A: def func(cls): 这里的cls指的是类本身A
1、不用实例化就可以直接调用。
2、它可以通过cls使用类变量
3、它不能直接调用这个类里面的其他实例方法和实例变量
class Foo:
no = 100
def __init__(self, name):
self.name = name
def ord_func(self):
print('这是一个实例方法')
@classmethod
def cls_func(cls):
#调用实例变量 直接print(cls.name)会报错,需要实例对象之后实例去调用
foo = Foo('KOBE')
print(foo.name)
#调用实例方法,同上 直接cls.ord_func()会报错
foo.ord_func()
#调用静态方法,不能直接statc_func()会报错,需要用类名.静态方法来调用
Foo.static_func()
#可以直接调用类变量
print(cls.no)
#可以直接调用其他的类方法
cls.cls_func2()
@classmethod
def cls_func2(cls):
print('这是类方法')
@staticmethod
def static_func():
print('这是一个静态方法')
if __name__ == "__main__":
Foo.cls_func()#调用类方法
静态方法
@staticmethod 静态方法就是一个普通函数,放在类中,无法直接引用类变量、类方法、实例变量、实例方法
就理解为这个静态方法是类外面的一个方法,只是放在了类中写着,除了可以直接用类名调用该方法之外,其余所有的和类外部的函数没区别
class Foo:
no = 100
def __init__(self, name):
self.name = name
def ord_func(self):
print(self.no)
@classmethod
def cls_func(cls):
print('这是类方法')
@staticmethod
def static_func():
""" 定义静态方法 ,无默认参数"""
##无法直接引用类变量,需要用类名.类变量来引用
print('静态方法',Foo.no)
##无法直接引用类方法cls_func(),需要用类名.类方法来引用
Foo.cls_func()
##无法直接引用实例变量name,需要先实例类,然后实例对象引用
foo=Foo('Jack')
print(foo.name)
#无法直接引用实例方法ord_func,需要先实例类,然后实例对象引用
foo.ord_func()
if __name__ == "__main__":
Foo.static_func()
输出:
静态方法 100
这是类方法
Jack
100
总结
1.实例可以调用实例属性、方法,也可以直接调用类属性、类方法、静态方法,只是不推荐使用实例直接去调用。 实例方法第一个参数是self,就是实例本身
2.类属性、方法可以直接用类名去调用,类方法第一个参数是cls,就是类本身
3.静态方法,相当于存放在类中的外部函数,可以直接使用类名调用,一般用来处理一些和类中属性没什么相关性的操作
4.当然根据动态语言特性,都可以给实例或者类动态绑定属性、方法