ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

面向对象之类方法,属性方法,和静态方法

2022-02-17 21:01:10  阅读:162  来源: 互联网

标签:静态方法 name self Dog 面向对象 eating 方法 eat def


一、静态方法

可以利用@staticmethod装饰器把一个方法变成一个静态方法。静态方法不可以方法实例变量或者类变量,也就是说不可以使用self.属性这样子调用实例属性了。其实静态方法就和类本身没什么关系了,它和类

唯一的关联就是需要通过类名来调用这个方法。

错误调用方式:

复制代码
class Dog(object):
def init(self,name):
self.name = name
@staticmethod #把eat方法变为静态方法
def eat(self):
print("%s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat()
复制代码
上面的调用会出以下错误,说是eat需要一个self参数,但调用时却没有传递,没错,当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。

正确调用方法:

复制代码
class Dog(object):
def init(self,name):
self.name = name
@staticmethod
def eat():
print(" is eating")
d = Dog("ChenRonghua")
d.eat()
复制代码
或者:

复制代码
lass Dog(object):
def init(self,name):
self.name = name
@staticmethod #把eat方法变为静态方法
def eat(self):
print("%s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat(d)
复制代码
二、类方法

类方法是用@classmethod装饰器来实现的,类方法只能访问类变量,不能访问实例变量。

1
2
3
4
5
6
7
8
9
10
class Dog(object):
def init(self,name):
self.name = name

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

d = Dog("ChenRonghua")
d.eat()
上面的name是构造方法里面定义的,是一个实例变量,类方法是不能访问的。所以会报错:dog没有name属性

对比下面的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Dog(object):
name = "我是类变量"
def init(self,name):
self.name = name

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

d = Dog("ChenRonghua")
d.eat()

执行结果

我是类变量 is eating
三、属性方法

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

1
2
3
4
5
6
7
8
9
10
11
12
class Dog(object):

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

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

d = Dog("ChenRonghua")
d.eat()
  调用会出以下错误, 说NoneType is not callable, 因为eat此时已经变成一个静态属性了, 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了

正确的使用:

1
2
3
4
5
d = Dog("ChenRonghua")
d.eat

输出
ChenRonghua is eating

标签:静态方法,name,self,Dog,面向对象,eating,方法,eat,def
来源: https://www.cnblogs.com/hzangyao/p/15906370.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有