类方法和静态方法 | 学习笔记

简介: 快速学习类方法和静态方法,介绍了类方法和静态方法系统机制, 以及在实际应用过程中如何使用。

开发者学堂课程【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)

p1 = Person('张三’,18)

# 实例对象在调用方法时,不需要给形参 self 传参,会自动的把实例对象传递给 self

P1.eat(‘红烧牛肉泡面’)   # 直接使用实例对象调用方法

p2 = Person(‘李四’,19)

类里面有一个方法叫 eat 方法,实例对象在调用方法时不需要给形参 self 传参,会自动的把实例对象传递给 self。

image.png

函数存在一个内存,内存中有一个 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)

p1 = Person('张三,18)

# 实例对象在调用方法时,不需要给形参 self 传参,会自动的把实例对象传递给 self

P1.eat(‘红烧牛肉泡面’)   # 直接使用实例对象调用方法

p2 = Person(‘李四’,19)

print(p1.eat)

print(p2.eat)

print(p1.eat is p2.eat)

image.png

输入 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)

p1 = Person('张三,18)

# 实例对象在调用方法时,不需要给形参 self 传参,会自动的把实例对象传递给 self

P1.eat(‘红烧牛肉泡面’)  # 直接使用实例对象调用方法

p2 = Person(‘李四’,19)

#print(p1.eat)

#print(p2.eat)

#print(Person.eat)

Person.eat(‘西红柿鸡蛋盖饭’)

image.png在打印 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)

p1 = Person('张三’,18)

# 实例对象在调用方法时,不需要给形参 self 传参,会自动的把实例对象传递给 self

p2 = Person(‘李四’,19)

# eat 对象方法,可以直接使用实例对象.方法名(参数)调用

# 使用对象名.方法名(参数)调用的方式,不需要传递 self

# 会自动将对象名传递给 self

p1.eat('红烧牛肉泡面)  # 直接使用实例对象调用方法

# 对象方法还可以使用类对象来调用类名.方法名()

# 这种方式,不会自动给self传参,需要手动的指定self

Person.eat(p2,‘西红柿鸡蛋盖饭)

image.png

输入 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):  # 对象方法有一个参数self,指的是实例对象

print(self.name +‘正在吃’+food)

# 如果一个方法里没有用到实例对象的任何属性,可以将这个方法定义staticmethod

@staticmethod

def demo():  # 默认的方法都是对象方法

print( ‘ hello’)

# 静态方法:没有用到实例对象的任何属

Person.demo()

p1.demo()

创建一个 demo 方法,默认的方法都是对象方法,但是在打印一hello之后会发现 demo 方法下会出现一个波浪线。

对象方法有一个参数 self ,指的是实例对象,如果要使用 name 属性那这个方法就要定义成对象方法,如果一个方法里没有用到实例对象的任何属性,可以将这个方法定义 static

这个方法不需要用到实例对象里的任何属性,那么这个方法是一个静态方法。静态方法可以用类调用也可以用实例对象调用,他没有用到实例对象的任何属性。 

2.静态方法的使用

class Calculator(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(12)

Calculator.add(1,4)

Calculator.minus(9,2)

面向对象的方法首先要有类,根据类来创建一个对象。很多时候只需要用到类,不需要创建对象。

定义一个计算器,如果想调用这个方法必须先创建一个对象,但让如果是静态方法可以直接用类来调用这个方法。在调用静态方法时可以创建一个对象再用对象调用 add 方法,但在函数的方法内部实现里没有用到任何创建的实例对象。

面向对象的关注点是让谁来做,相当于把多个函数打包放到了一个类里,然后通过类名调用。

 

三、类方法

class Person(object):

type = ‘human‘

@classmethod

def test(cls):   # 如果这个函数只用到了类属性,我们可以把定义成为一个类方法

# 类方法会有一个参数cls,也不需要手动的传参,会自动传参

# cls指的是类对象cls == Person ==> True

print( 'yes')

如果这个函数只用到了类属性,可以把它定义成为一个类方法。类方法可以使用实例对象和类对象调用。

类方法会有一个参数 cls ,也不需要手动的传参,会自动传参cls 指的是类对象,这里的 cls 就是 person。

相关文章
|
18天前
|
开发者
静态方法和实例方法的区别是什么?
静态方法和实例方法在面向对象编程中各自扮演着重要的角色,开发者需要根据具体的业务需求和设计原则来合理地使用它们,以实现高效、可读和易于维护的代码结构。
63 12
|
14天前
静态方法和实例方法有何不同?
静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制
|
18天前
|
JavaScript 前端开发
静态方法和类的实例方法的执行顺序是怎样的?
静态方法和实例方法的执行顺序取决于具体的调用逻辑和代码结构,理解它们之间的执行顺序有助于更好地组织和编写面向对象的 JavaScript 代码,确保程序的逻辑正确和清晰。
42 10
|
18天前
在类中使用静态方法和实例方法有什么区别?
在类中合理地使用静态方法和实例方法,可以更好地组织和管理代码,提高代码的可读性、可维护性和性能,根据具体的业务需求和逻辑来选择使用哪种方法是编写高质量面向对象代码的关键。
|
2月前
|
Python
深入理解Python中的类方法、类实例方法和静态方法
深入理解Python中的类方法、类实例方法和静态方法
26 0
|
2月前
|
Python
深入理解Python中的类方法、类实例方法和静态方法
深入理解Python中的类方法、类实例方法和静态方法
25 0
|
4月前
|
存储 Java 程序员
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
80 4
|
Java
16 类变量(静态变量)与类方法(静态方法)
1 .静态变量 静态变量指在类中被static修饰的变量
101 0
|
开发者 Python
类方法和静态方法 | 学习笔记
快速学习类方法和静态方法,介绍了类方法和静态方法系统机制, 以及在实际应用过程中如何使用。
类方法和静态方法 | 学习笔记
|
开发者 Python
类方法和静态方法回顾|学习笔记
快速学习类方法和静态方法回顾
类方法和静态方法回顾|学习笔记