zoukankan      html  css  js  c++  java
  • 9.1.面向对象:静态方法、类方法、属性方法

    前言:认为方法与函数同意义,由于这里使用method,所以称为方法


    静态方法:

    • 使用@staticmethod来定义静态方法。
    • 静态方法:类和实例都可以调用的方法,实际上跟类没什么关系了,对于这种不太相关的就使用静态方法【用实例和类调用没有区别】
    class Dog(object):
        def __init__(self,name):
            self.name=name
        def talk(self):
            print("%s is talking"%self.name)
        @staticmethod
        def eat(self,food):##
            print("%s is eating %s"%(self.name,food))
    
        @staticmethod
        def bulk():  ##如果不涉及实例变量的内容,可以不传self
            print("wang wang!")
    
    d=Dog("haha")
    d.talk()
    Dog.eat(d,"baozi")
    d.eat(d,"mianbao")
    d.bulk()
    Dog.bulk()

    注:由于不太相关,所以不会自动传self,如果操作涉及对象的内容,需要手动传入

    image


    类方法:

    • 使用@classmethod来定义类方法
    • 类方法只能访问类变量,不能访问实例变量
    • 如果涉及类变量比较多,而涉及实例变量比较少的话,使用类方法
    class Dog(object):
        name="haha"
        def __init__(self,name):
            self.name=name
    
        @classmethod
        def eat(self):
            print(self)# <class '__main__.Dog'>  说明self是一个类
            print("%s is eating "%self.name)#所以只会调用类中的name
    
    d=Dog("aotuman")
    d.eat()##haha is eating
    Dog.eat()##haha is eating
    d2=Dog("huluwa")
    d2.eat()

    注:类方法中的self是一个类,因此才会只访问类变量


    属性方法:

    现有需求:我输入因数,你就会打印出我要的计算结果

    用变量来实现:image

    缺点:无法约束赋值,假如我要限制不能输入非数字【实际上,如果要做这样的约束,就要建立一个函数,这实际上与属性方法相同,而如果在my_sum里面检测的话,就比建立一个函数还要麻烦了】

    用属性方法来实现:

    image

    • 代码:

    解释:

    • @property用于获取;@setter用于赋值传参;@deleter用于删除属性,并不影响其他与当前@property无关的函数
    • 要想他们三个关联起来,函数名必须相同,且前缀是@property修饰的函数的名

    image

    class calc:
        @property
        def my_sum(self):
            print(self.one+self.two)
        @my_sum.setter
        def my_sum(self,l):
            if isinstance(l[0],int)&isinstance(l[1],int):
                self.one=l[0]
                self.two=l[1]
            else:
                print("no int")
        @my_sum.deleter
        def my_sum(self):
            print("del done")
            del self.one,self.two
    c=calc()
    c.my_sum=[1,2]
    c.my_sum
    del c.my_sum
  • 相关阅读:
    Jzoj4822 完美标号
    Jzoj4822 完美标号
    Jzoj4792 整除
    Jzoj4792 整除
    Educational Codeforces Round 79 A. New Year Garland
    Good Bye 2019 C. Make Good
    ?Good Bye 2019 B. Interesting Subarray
    Good Bye 2019 A. Card Game
    力扣算法题—088扰乱字符串【二叉树】
    力扣算法题—086分隔链表
  • 原文地址:https://www.cnblogs.com/progor/p/8419606.html
Copyright © 2011-2022 走看看