zoukankan      html  css  js  c++  java
  • python之路第七天

    上篇我们已经了解了一些面向对象的基础知识,本次就了解下面向对象的一些进阶知识(虽然我也不知道有什么卵用)。

    静态方法(@staticmethod)

    静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法;

    说了那么多,估计会有些懵逼,咱们还是直接上代码看下静态方法怎么使用吧!

    1.按照正常逻辑编写代码并加上@staticmethod定义静态方法eat:

    class People(object):
    
        def __init__(self,name):
    
            self.name = name
      
        @staticmethod #把eat方法变为静态方法
        def eat(self):
    
            print("%s is eating" % self.name)
      
    d = People("houyafan")
    
    d.eat()

    运行上面代码,我们会发现报以下错误:

    TypeError: eat() missing 1 required positional argument: 'self'

    ----------eat需要一个self参数,但调用时却没有传递

    so...我们可以得出一个结论:eat变成静态方法后,再通过实例调用时不会自动把实例本身当作一个参数传给self

    2.解决办法:

    1)调用时主动传递实例本身给eat方法,即d.eat(d) 

    class People(object):
    
        def __init__(self, name):
            self.name = name
     
        @staticmethod  # 把eat方法变为静态方法
        def eat(self):
    
            print("%s is eating" % self.name)
    
    d = People("houyafan")
    
    d.eat(d)
    
    #------打印输出------
    #houyafan is eating

    2)在eat方法中去掉self参数(这也意味着,在eat中不能通过self.调用实例中的其它变量了)

    class People(object):
    
        def __init__(self, name):
            self.name = name
     
        @staticmethod  # 把eat方法变为静态方法
        def eat():
    
            print("%s is eating" % self.name)
     
    d = People("cc")
    
    d.eat()
    #------------------打印输出----------------
    #print("%s is eating" % self.name)
    
    #NameError: name 'self' is not defined
    # 也就证明静态方法无法访问 类中变量

    类方法(@classmethod

    类方法是将类本身作为对象进行操作的方法,类方法使用@classmethod装饰器定义,其第一个参数是类,约定为cls。类对象和实例都可以调用类的方法。

    类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。

    依然还是原来的代码,把eat变为类方法看下:

    2)在eat方法中去掉self参数(这也意味着,在eat中不能通过self.调用实例中的其它变量了)

     
  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/houyf/p/5855708.html
Copyright © 2011-2022 走看看