Python类方法,静态方法和实例方法

桥蕤
• 阅读 26

类的方法可分为类方法,静态方法和实例方法;这样的分类可以让代码开发更加的简洁明了,观看代码更有层次感,方便日后的维护工作;

一个类对象的行为即是该类的方法,类中的方法一般格式如下:

class 类名(参数):
    def 方法名(参数):
        ...

1.类方法

类方法使用 @classmethod装饰器来声明:

class 类名(参数):

    @classmethod
    def 方法名(cls,参数):
        ...
  • cls可以理解为class的缩写,表示调用整个类 ;

  • 类方法不能直接修改实例属性;

  • 类方法通常用来调整类属性,可通过 cls.类属性 的方式改变类属性;

  • 推荐调用类方法的格式: 类名.方法名

    # 演示类方法
    class MyClass:
      class_str = '我是类属性'
    
      @classmethod
      def class_method(cls):
          cls.class_str = '我改了类属性'
    
    

输出类属性

print(MyClass.class_str)

调用类方法

MyClass.class_method()

查看改变后的类属性

print(MyClass.class_str)

## 2.静态方法
静态方法使用 **@staticmethod**装饰器来声明:
``` python
​class 类名(参数):

    @staticmethod
    def 方法名():
        ...
  • 静态方法中不需要 cls(类)和self(实例) 与类和实例无关;

  • 推荐调用静态方法的格式: 类名.方法名

    ​# 演示静态方法
    class MyClass:
      class_str = '我是类属性'
    
      def __init__(self):
          self.instance_str = '我是实例属性'
    
      @staticmethod
      def static_method():
          print('我既不改变类属性,也不改变实例属性')
    
    

创建实例

my_instance = MyClass()

输出类属性

print(MyClass.class_str)

输出实例属性

print(my_instance.instance_str)

调用静态方法

MyClass.static_method()

查看后续

print(MyClass.class_str) print(my_instance.instance_str)

## 3.实例方法
实例方法不需要在类中使用装饰器修饰,格式如下
``` python
​class 类名(参数):

    def 方法名(self,参数):
        ...
  • self可以理解成当前实例 ,哪个实例用来它,它就是哪个实例

  • 实例方法不能直接修改类属性,

  • 实例方法不能直接用 类名 调用,需要新建实例出来才能通过实例名调用;

  • 推荐调用实例方法的格式: 实例名.方法名

    ​# 演示实例方法
    class MyClass:
     class_str = '我是类属性'
    
     def __init__(self):
         self.instance_str = '我是实例属性'
    
     def instance_method(self):
         self.instance_str = '改了实例属性'
         # 注意这里的class_str并不是类属性,而是和类属性重名的实例属性;
         # 是通过实例方法新建出来的实例属性,要改变类属性用 类方法cls
         self.class_str = '改了类属性?'
    
    

创建实例

my_instance = MyClass()

输出类属性

print(MyClass.class_str)

输出实例属性

print(my_instance.instance_str) print(my_instance.class_str) # 没有调用实例方法此时class_str指代类属性

调用实例方法

my_instance.instance_method()

MyClass.instance_method() # 错误使用

print('-' * 31)

输出类属性

print(MyClass.class_str)

输出实例属性

print(my_instance.instance_str) print(my_instance.class_str) # 调用了实例方法后,此时已经新建出实例属性class_str

```

总结

  • 类方法使用@classmethod,通过cls修改类的状态,不能直接修改实例的状态;
  • 静态方法使用 @staticmethod 声明此方法不使用cls和self;
  • 实例方法通过self来修改实例状态,不能直接修改的类状态;
点赞
收藏
评论区
推荐文章
HelloWorld官方 HelloWorld官方
3年前
C++ 基本语法
C程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。对象对象具有状态和行为。例如:一只狗的状态颜色、名称、品种,行为摇动、叫唤、吃。对象是类的实例。类类可以定义为描述对象行为/状态的模板/蓝图。方法从基本上说,一个方法表示一种行为。一个类可以包含多个
Wesley13 Wesley13
2年前
java中static关键字的使用
知识点:java中,static关键字修饰类的变量、方法、代码块、内部类场景:我们在创建类的方法和变量时,如果这个类在创建多个对象时,共用同一个属性或者方法,就可以使用static关键字修饰,因为static修饰的变量,在内存的静态域存在的值,被类的多个实例所共用,实际上我们在编写一个类时,就是在描述对象的属性和行为,并没有产生实质上的对
Wesley13 Wesley13
2年前
java反射大全
作者对反射的理解:方法的调用(正常的调用:对象.方法()。反射调用方法:方法.对象())静态属性的调用(正常的调用:类.属性。反射调用:属性.类)常见反射的用法:        1.通过反射获取类Class<?demo1Class
Easter79 Easter79
2年前
Spring使用静态工厂方法创建Bean
1\.使用静态工厂方法创建Bean    使用静态工厂方法创建Bean实例时,class属性也必须指定,但此时class属性并不是指定Bean实例的实现类,而是静态工厂类。因为Spring需要知道是用哪个工厂来创建Bean实例。另外,还需要使用factorymethod来指定静态工厂方法名,Spring将调用静态工厂方法(可能包含一组参数),
Stella981 Stella981
2年前
Python中的@函数装饰器到底是什么?
在解释@函数装饰器之前,先说一下,类中的类方法和静态方法。在Python中完全支持定义类方法、静态方法。这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以)。区别在于:Python会自动绑定类方法的第一个参数,类方法的第一个参数会自动绑定到类本身;但对于静态方法则不会自动绑定。类方法用@classmethod
Wesley13 Wesley13
2年前
Java 类及类的构造方法
类类是一个模子,确定对象将会拥有的特性(属性)和行为(方法)。类的特点  类时对象的类型  具有相同属性和方法的一组对象的集合构造方法作用就是对类进行初始化。如果你没有定议任何构造方法的形式,Java会为你取一个不带任何参数的构造函数,那么你产生类的对像时只能用不带参数的方法,如:classa{}//没
Wesley13 Wesley13
2年前
Java构造方法与析构方法实例剖析
Java构造方法类有一个特殊的成员方法叫作构造方法,它的作用是创建对象并初始化成员变量。在创建对象时,会自动调用类的构造方法。构造方法定义规则:Java中的构造方法必须与该类具有相同的名字,并且没有方法的返回类型(包括没有void)。另外,构造方法一般都应用public类型来说明,这样才能在程序任意的位置创建类的实例-
Easter79 Easter79
2年前
Swift讲解专题十二——方法
Swift讲解专题十二——方法一、引言      方法只是一个术语,其实就是将函数与特定的类型结合,类、结构体、枚举都可以定义方法,方法又分为实例方法和类型方法,类型方法类似于ObjectiveC中的类方法。Swift和ObjectiveC的一大不同是,ObjectiveC只有在类中可以定义方法。
Wesley13 Wesley13
2年前
Java高级特性2
\TOC\1\.static关键字1.1类变量、类方法/static关键字类变量不用实例化,直接类名.属性名就可以使用,是类的一部分,被所有这个类的实例化所共享,也可以叫做静态变量如果想让一个类的所有实例共享数据,就用类变量!
Wesley13 Wesley13
2年前
Java中类的加载顺序剖析(常用于面试题)
如果类A和类B中有静态变量,静态语句块,非静态变量,非静态语句块,构造函数,静态方法,非静态方法,同时类A继承类B,请问当实例化A时,类内部的加载顺序是什么?Demo:ClassB:publicclassB{//静态变量staticinti1;//静态语句块static{
桥蕤
桥蕤
Lv1
夕阳无限好,只是近黄昏。
文章
4
粉丝
0
获赞
0