python学习第七周之静态方法、类方法、属性方法和一些类的成员方法

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

(1)我们先看以下代码,实例化一个对象后,d可以直接调用talk()

class Dog(object):
    def __init__(self,name):
        self.name=name
    def talk(self):
        print("%s is talking" % self.name)
d=Dog("chen")
d.talk()

 (2)而我们在使用静态方法后,实例化后直接调用的话d.eat()会报错,因为在静态方法中,实例化的name是传递不进去eat函数中的;

class Dog(object):
    def __init__(self,name):
        self.name=name
    @staticmethod   #静态方法实际跟类没有关系,但是必须通过类名去调用;调用不了类的变量跟实例变量,相当于只是类的一个函数
    def eat(self):  #在实例化后是传不进来的,如果想要传进来,那么需要将d传进来
        print("%s is eating %s" %(self.name,'包子'))
d=Dog("chen")
d.eat()  #报错eat() missing 1 required positional argument: 'self',实例化后的self传不进去

 所以我们这时候如果要访问eat()方法,则需要将实例传递给改函数,即

d.eat(d)

 这样便可以将实例化对象d的name “chen”传递给eat函数。

2.类方法

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

如以下程序,我们将eat()方法定义为类方法,这时发现在实例化对象后,调用eat方法后报错,这时在构造函数中添加变量 self.n  = 333,执行仍然报错,说明类方法,不能访问实例变量

class Dog(object):
    def __init__(self,name):
        self.name=name
        self.n  = 333
    @classmethod     #类方法,只能访问类变量,不能访问实例变量
    def eat(self):  #在实例化后是传不进来的,如果想要传进来,那么需要将d传进来
        print("%s is eating %s" %(self.name,'包子'))
        print("%s is eat %s" %(self.n,'包子'))
d=Dog("chen")
d.eat()

 而我们在Dod类中添加两个类变量,这时再执行程序:

class Dog(object):
    n=333
    name="hhh"
    def __init__(self,name):
        pass

 由上可知,类方法只能访问类变量

3.属性方法

属性方法:把一个方法变成一个静态属性,

(1)如以下程序:

class Dog(object):
    def __init__(self,name):
        self.name=name 
    @property  #attribute
    def eat(self):
        print("%s is eating %s" %(self.name,'包子'))
d=Dog("chen")
#d.eat()  #这样调用时报错,应该d.eat
d.eat   # 属性方法:把一个方法变成一个静态属性

 此时,eat方法为静态属性,所以d.eat()调用时会报错,我们需要这样来调用:d.eat

(2)A 这时eat是一个属性,没有办法通过括号来传递参数,这时如果要给eat传递参数,要写一个相同的eat函数,这时传递参数时便可以传递进来;

  @eat.setter
    def eat(self, food):
        print("set to food:", food)
d=Dog("chen")
d.eat   # 属性方法:把一个方法变成一个静态属性
d.eat="baozi"   #如果要传递参数,必须在写一个相同的函数,@eat.setter

 以上程序输出结果如下: 这时看到baozi被传递进来

chen is eating 包子
set to food: baozi    

   B 将以上给eat的赋值存储下来,在打印的时候发现输出结果发生变化:

class Dog(object):
    def __init__(self,name):
        self.name=name
        self.__food=None
    @property  #attribute
    def eat(self):
        print("%s is eating %s" % (self.name, self.__food))
    @eat.setter
    def eat(self, food):
        print("set to food:", food)
        self.__food=food
d=Dog("chen")
d.eat   # 属性方法:把一个方法变成一个静态属性
d.eat="baozi"   #如果要传递参数,必须在写一个相同的函数,@eat.setter
d.eat

 将传递给eat的参数“baozi”存下来:结果如下

chen is eating None
set to food: baozi
chen is eating baozi

 (3)删除属性:再写一个相同的函数,删除;这时在调用d.eat报错

@eat.deleter
    def eat(self):
        del self.__food
        print("删除完成")
del d.eat 
d.eat #删除私有属性后,再次调用时报错

 4.类的特殊成员方法:(以3的程序为例)

(1)__call__() 方法

  __call__对象后面加括号,触发执行。

构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

将d实例化d=Dog("chen")后,再直接d()报错,这时我们在类Dog中写一个__call__()方法,

class Dog(object):

        def __call__(self, *args, **kwargs):
        print("running call",args,kwargs)
d=Dog("chen")
d()     #d=Dog("chen") d(),与Dog("chen")()一样
d(1,2,3,name=333)

 这时看到输出结果为:

running call () {}
running call (1, 2, 3) {'name': 333}

 (2)__dict__()方法

  没有实例化对象时,将类的方法以字典的形式打印出来,但是不包括实例的属性

#__dict__方法
print(Dog.__dict__)   #没有实例化对象以字典的形式将类的方法打印出来,不包括实例属性

   实例化对象后,打印对象的实例属性:

d=Dog("chen")
print(d.__dict__)    #通过实例调用,只打印了所有的实例变量
输出结果如下:
{'name': 'chen', '_Dog__food': None}

(3)__str__方法:

  如果我们直接实例化后打印,没有写str方法的话,输出的为内存地址

d=Dog("chen")
print(d)  #如果没有str方法,打印输出为<__main__.Dog object at 0x01104B70>;如果写入str方法,在打印对象时,默认输出该方法的返回值

   如果我们在类Dog中写入str方法,在实例化后打印,输出结果为该方法的返回值

    def __str__(self):
        return "<obj:%s>"%self.name
d=Dog("chen")
print(d)  #如果写入str方法,在打印对象时,默认输出该方法的返回值:<obj:chen>

 

转载于:https://www.cnblogs.com/wuxiaoru/p/11504768.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的方法静态方法是在级别上执行操作的工具。方法可以使用属性方法,而静态方法则不能。使用这些方法可以更好地组织代码,并提高代码的可读性和可维护性。\[2\] 方法是定义在上的方法,可以通过的实例来调用。方法使用@classmethod装饰器进行标识,它的第一个参数是本身,通常被命名为"cls"。方法可以访问属性方法,并且可以在的实例化之前或之后执行一些操作。\[1\] 静态方法也是定义在上的方法,可以通过的实例来调用。静态方法使用@staticmethod装饰器进行标识,它不需要或实例作为第一个参数。与方法不同,静态方法不能访问或实例的属性方法静态方法通常用于定义与无关的辅助函数,或者在不需要访问属性方法时执行一些操作。\[3\] 总结来说,方法静态方法都是在级别上执行操作的方法,但方法可以访问属性方法,而静态方法不能。选择使用哪种方法取决于具体的情况,如果需要访问属性方法,则使用方法,如果不需要访问属性方法,则使用静态方法。\[2\] #### 引用[.reference_title] - *1* [Python 实例方法方法静态方法](https://blog.csdn.net/lihao21/article/details/79762681)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Python-方法静态方法](https://blog.csdn.net/weixin_44412085/article/details/129968953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值