类和实例

类和实例

实例方法 实例变量

实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,也叫做成员变量

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.当然根据动态语言特性,都可以给实例或者类动态绑定属性、方法

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值