开发者学堂课程【Python 入门 2020年版:类方法和静态方法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10381
类方法和静态方法
内容介绍:
一、 对象方法
二、 静态方法
三、 类方法
一、对象方法
对象方法可以用实例对象来调用也可以用类对象来调用,如用使用实例对象调用实例对象直接指的就是实例对象,如果使用类对象调用需要手动的给 self 传递参数。
1.实例对象调用
在 python 里有一些重要的类方法和静态方法
class Person(object):
def _init_(self,name,age):
self.name = name
self.age = age
def eat(self, food) :
print(self.name + "正在吃'+food)
p
1
= Person('张三’,18)
# 实例对象在调用方法时,不需要给形参 self 传参,会自动的把实例对象传递给 self
P1.eat(‘红烧牛肉泡面’) # 直接使用实例对象调用方法
p2 = Person(‘李四’,19)
类里面有一个方法叫 eat 方法,实例对象在调用方法时不需要给形参 self 传参,会自动的把实例对象传递给 self。
函数存在一个内存,内存中有一个 person 类, person 类指向一块内存空间。创建一个 p1 对象,对象里存放一个 name:张三、age:18,这个属性叫实例属性是每一个对象都会保存的。
内存中还有一个方法叫 eat 方法,这个方法存在 person 类中。如果创建一个 p2对象存放 name:李四、age:19,他也没有存放 eat 方法。
2.类对象调用
class Person(object):
def _init_(self,name,age):
self.name = name
self.age = age
def eat(self, food) :
print(self.name + ‘正在吃'+food)
p
1
= Person('张三,18)
#
实例对象在调用方法时,不需
要给形参
self 传参,会自动的把实例对象传递给
self
P
1
.eat(
‘红烧牛肉泡面’
) # 直接使用实例对象调用方法
p2 = Person(‘李四’,19)
print(p1.eat)
print(p2.eat)
print(p1.eat is p2.eat)
输入 print(p1.eat is p2.eat) 打印显示 false 发现他们并不是一个函数。
在这里有一个绑定的操作: bound method ,这个方法没有自己保存也没有用同一个方法,这个方法与每一个实例对象都进行了绑定,不同的对象绑定不同的方法。
class Person(object):
def _init_(self,name,age):
self.name = name
self.age = age
def eat(self, food) :
print(self.name + ‘正在吃'+food)
p
1
= Person('张三,18)
# 实例对象在调用方法时,不需要给形参 self 传参,会自动的把实例对象传递给 self
P
1
.eat(
‘红烧牛肉泡面’
)
# 直接使用实例对象调用方法
p2 = Person(‘李四’,19)
#print(p1.eat)
#print(p2.eat)
#print(Person.eat)
Person.
eat(‘
西红柿鸡蛋盖饭
’)
在打印 person 。
eat 之后每一个都有 eat 方法但地址都不一样,所以 person 也能访问 eat 方法。
class Person(object):
def _init_(self,name,age):
self.name = name
self.age = age
def eat(self, food) :
print(self.name + "正在吃'+food)
p
1
= Person('张三’,18)
# 实例对象在调用方法时,不需要给形参 self 传参,会自动的把实例对象传递给 self
p2 = Person(‘李四’,19)
# eat 对象方法,可以直接使用实例对象.方法名(参数)调用
# 使用对象名.方法名(参数)调用的方式,不需要传递 self
# 会自动将对象名传递给 self
p1.eat('红烧牛肉泡面‘) # 直接使用实例对象调用方法
# 对象方法还可以使用类对象来调用类名.方法名()
# 这种方式,不会自动给self传参,需要手动的指定self
Person.eat(p2,‘西红柿鸡蛋盖饭’)
输入 Person.eat(‘西红柿鸡蛋盖饭’) 运行之后会发现系统崩溃,报错显示 eat() 中缺少‘food’参数。 eat 对象方法,可以直接使用实例对象.方法名(参数)调用,使用对象名.方法名(参数)调用的方式,不需要传递 self 会自动将对象名传递给 self 。对象方法还可以使用类对象来调用类名.方法名(),这种方式不会自动给 self 传参,需要手动的指定 self 。
他的作用是当 eat 时并不是实例对象调用而是用类对象调用。如果使用实例对象调用他会自动把实例对象传给 self ,但是如果使用类对象调用则不会传给 self ,需要手动给 self 传递一个参数,例如 Person.eat(p2,‘西红柿鸡蛋盖饭’) 则会把 p2 传给 self ,现在则会显示李四正在吃西红柿鸡蛋盖饭。
二、静态方法
1.调用静态方法
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self,food): # 对象方法有一个参数se
l
f,指的是实例对象
print(self.name +‘正在吃’+food)
# 如果一个方法里没有用到实例对象的任何属性,可以将这个方法定义成 staticmethod
@
staticmethod
def demo(): # 默认的方法都是对象方法
print( ‘ hello’)
# 静态方法:没有用到实例对象的任何属
Person.demo()
p1.demo()
创建一个 demo 方法,默认的方法都是对象方法,但是在打印一hello之后会发现 demo 方法下会出现一个波浪线。
对象方法有一个参数 self ,指的是实例对象,如果要使用 name 属性那这个方法就要定义成对象方法,如果一个方法里没有用到实例对象的任何属性,可以将这个方法定义成 static 。
这个方法不需要用到实例对象里的任何属性,那么这个方法是一个静态方法。静态方法可以用类调用也可以用实例对象调用,他没有用到实例对象的任何属性。
2.静态方法的使用
class
C
alculator(object):
def _init_(self, m,n):
self.m =m
self.n = n
@
staticmethod
def add(a,b):
return a + b
@
staticmethod
def minus(a,b):
return a – b
@
staticmethoddef
def
mul(a,b):
return a * b
# c = CaLculator(100
,200)
# c.add(1
,
2)
C
alculator.a
d
d(1,4)
C
alculator.minus(9,2)
面向对象的方法首先要有类,根据类来创建一个对象。很多时候只需要用到类,不需要创建对象。
定义一个计算器,如果想调用这个方法必须先创建一个对象,但让如果是静态方法可以直接用类来调用这个方法。在调用静态方法时可以创建一个对象再用对象调用 add 方法,但在函数的方法内部实现里没有用到任何创建的实例对象。
面向对象的关注点是让谁来做,相当于把多个函数打包放到了一个类里,然后通过类名调用。
三、类方法
class Person(object):
type
=
‘human‘
@classmethod
def test(cls): # 如果这个函数只用到了类属性,我们可以把定义成为一个类方法
# 类方法会有一个参数cls,也不需要手动的传参,会自动传参
# cls指的是类对象cls == Person ==> True
print( 'yes')
如果这个函数只用到了类属性,可以把它定义成为一个类方法。类方法可以使用实例对象和类对象调用。
类方法会有一个参数 cls ,也不需要手动的传参,会自动传参,cls 指的是类对象,这里的 cls 就是 person。