设为首页 加入收藏

TOP

day7面向对象--进阶(一)
2017-09-30 17:29:28 】 浏览:7076
Tags:day7 面向 对象 进阶

静态方法(@staticmethod)

    通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法。

class Dog(object):
    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print("%s is eating %s" %(self.name,food))

d = Dog("chenronghua")
d.eat("包子")
运行结果如下:
chenronghua is eating 包子

    上面我们创建了一个类,代码也能够正常执行。下面,在eat()方法上加静态方法。

class Dog(object):
    def __init__(self,name):
        self.name = name
        
    @staticmethod           #加上静态方法
    def eat(self,food):
        print("%s is eating %s" %(self.name,food))

d = Dog("chenronghua")
d.eat("包子")
运行如下:
Traceback (most recent call last):
  File "/home/zhuzhu/第七天/static_method.py", line 10, in <module>
    d.eat("包子")
TypeError: eat() missing 1 required positional argument: 'food'

    从上面运行结果可以看出,加上@staticmethod之后,代码就执行错误了,提示eat()少了一个参数。

    下面我们给eat()方法传入两个参数,如下:

class Dog(object):
    def __init__(self,name):
        self.name = name

    @staticmethod
    def eat(self,food):
        print("%s is eating %s" %(self,food))

d = Dog("chenronghua")
d.eat("chenronghua","包子")
运行如下:
chenronghua is eating 包子

    从上面结果可以看出,加入参数之后,执行eat()方法是没有问题的,从中可以看出,加上@staticmethod之后,eat()变成静态方法了,本来eat()方法是能够接收self.name中类的属性的,现在不可以了,只能自己传递参数进来,说明跟类没有太多关系了,截断了与类的关系,eat()成为一个单独的函数,要自己传递函数,与类没有太多的关系,但是必须通过类来进行调用,不能独自在外面调用,必须通过类来进行调用,@staticmethod方法与我们跟台湾的关系一样,名义上属于中国,但是大陆有管不了台湾。名义属于,但是不能调用。

    静态方法:只是名义上归类管理,实际上静态方法里访问不了类或实例中的任何属性。

类方法

    类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

class Dog(object):
    def __init__(self,name):
        self.name = name

    @classmethod
    def eat(self):
        print("%s is eating" %self.name)

    def talk(self):
        print("%s is talking" %self.name)

d = Dog("chenronghua")
d.eat()
运行结果如下:
Traceback (most recent call last):
  File "/home/zhuzhu/第七天/class_method.py", line 14, in <module>
    d.eat()
  File "/home/zhuzhu/第七天/class_method.py", line 7, in eat
    print("%s is eating" %self.name)
AttributeError: type object 'Dog' has no attribute 'name'

    上面代码中,我们把@staticmethod换成@classmethod,我们知道@staticmethod是把类方法变成单独的函数,只能通过传递参数,名义上属于类,但是不能调用类中的属性和方法,现在@calssmethod也报错,说Dog类中没有name属性,我们知道,我们在里面定义了名字,说明@calssmethod也对类进行了修改。不能直接调用实例的属性。

class Dog(object):
    n = 666
    def __init__(self,name):
        self.name = name

    @classmethod
    def eat(self):
        print("%s is eating" %self.n)

    def talk(self):
        print("%s is talking" %self.name)

d = Dog("chenronghua")

d.eat()
运行结果如下:
666 is eating

    从上面可以看出,@classmethod是让类方法只能调用类的属性,不能调用实例的属性,类方法的作用就是这个。不能在调用实例属性。

    类方法:类方法只能方位类变量,不能访问实例变量

属性方法

    属性方法的作用就是通过@property把一个方法变成一个静态属性  

class Dog(object):

    def __init__(self,name):
        self.name = name

    @property            #属性,attribute
    def eat(self):
        print("%s is eating" %self.name)

    def talk(self)
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇what's the python之函数及装.. 下一篇Python简易爬虫爬取百度贴吧图片

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目