首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从类实例中调用classmethod作为方法是不好的形式?

首先,我们需要明确一个概念:类实例是Python中用于创建对象的一种方式,而classmethod是Python中用于定义类方法的一种关键字。

在Python中,定义类方法需要使用classmethod关键字。使用classmethod定义的类方法可以被类实例化对象调用,也可以被类本身调用。

类方法中包含了一个self参数,这个参数表示类实例。在类方法中,可以通过self参数获取类实例的相关信息,例如类实例的属性、方法等。

因此,从类实例中调用classmethod作为方法是不好的形式,因为这样会破坏类的封装性。一个更好的方式是,将类方法定义为静态方法,例如:

代码语言:python
代码运行次数:0
复制
class MyClass:
    def my_method(self):
        # do something

    @staticmethod
    def my_static_method():
        # do something

这样,我们就可以通过MyClass.my_static_method()方式调用类方法my_static_method,而不需要创建类实例对象。

总的来说,从类实例中调用classmethod作为方法是不好的形式,因为这样会破坏类的封装性。我们应该将类方法定义为静态方法,以更好地符合类的封装性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法?

static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象的时候父类会调用子类方法...但是:创建B对象父类会调用父类的方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...如果,子类重写了父类的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父类的方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...但是:由于java语言是静态多分派,动态单分派。其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

6.2K10

开源图书《Python完全自学教程》8.4方法

8.4.2 类方法 Python 的内置函数 classmethod() 的作用就是在类中以装饰器语法糖的形式定义类方法(Class Method)。...注释(9)则直接通过类名称调用类方法创建实例。 特别要注意,注释(9)通过类名称调用类方法,本来在类中所定义的类方法有三个参数,第一个是cls ,它引用的就是当前类对象。...那么在注释(9)中调用这个方法的时候,不再显式地在参数列表中传入类对象,Person.by_birth() 就表示类 Person 作为第一个参数传给了 cls 。...在类方法 from_csv() 中以 cls.validate() 的形式调用了当前类中的静态方法,显然此静态方法不需要与实例绑定。...至此,学习了类中的三种方法: 普通的实例方法:最常用的,第一个参数 self 是实例,用实例名称调用。 类方法:第一个参数 cls 是当前的类,必须用 @classmethod 装饰。

29310
  • 为什么 classmethod 比 staticmethod 更受宠?

    我们知道,classmethod 和 staticmethod 都可以作为函数的装饰器,都可用于不涉及类的成员变量的方法,但是你查一下 Python 标准库就会知道 classmethod 使用的次数(...这就要从 staticmethod 和 classmethod 的区别说起。 1、从调用形式上看,二者用法差不多 先说下什么是类,什么是实例,比如说 a = A(),那么 A 就是类,a 就是实例。...从定义形式上看,clasmethod 的第一个参数是 cls,代表类本身,普通方法的第一个参数是 self,代表实例本身,staticmethod 的参数和普通函数没有区别。...从调用形式上看,staticmethod 和 classmethod 都支持类直接调用和实例调用。...首先我们从 clasmethod 的形式上来理解,它的第一个参数是 cls,代表类本身,也就是说,我们可以在 classmethod 函数里面调用类的构造函数 cls(),从而生成一个新的实例。

    58150

    Python,你真的会使用 staticmethod 和 classmethod 吗?

    @staticmethod 装饰器 @staticmethod 修饰的方法称为:静态方法,和普通的函数没有什么区别 下面将聊聊实际项目中几种应用场景 1、要调用一个静态方法,一般使用形式是:「 类名.方法名...@classmethod 装饰器 @classmethod 修饰的方法称为:类方法,在使用的时候,会将类本身作为第一个参数 cls 传递给类方法 # 类方法,第一个参数为cls,代表类本身 @classmethod...def foo_classmethod(cls): pass 其中,cls 代表外层类本身,可以实例化,也可以直接调用静态方法、类方法、静态变量 下面逐一进行说明 1、要调用一个类方法,一般使用形式是...() 5、子类的使用 在子类中调用父类定义好的类方法,只需要将类名替换为子类名称即可,代码和静态方法类似 4.区别 下面总结一下普通方法、静态方法、类方法的区别 普通方法:第一个参数 self 代表实例对象本身...,利用「 cls.方法名() 」或「 类名.方法名() 」去调用静态方法和类方法;如果需要调用普通方法,需要先实例化一个对象,然后利用对象去调用普通方法 静态方法和类方法是针对类定义的,除了可以使用类名去调用

    7.6K43

    当类中的方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用,需要调用构造方法。 但 static的

    当类中的方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用,需要调用构造方法。...但 static的方法直接用类名调用就行!...的注意事项     a:在静态方法中是没有this关键字的       如何理解呢?       ...静态是随着类的加载而加载,this是随着对象的创建而存在。       静态比对象先存在。     ...成员变量属于对象,所以也称为实例变量(对象变量)。   B:内存中位置不同     静态变量存储于方法区的静态区。     成员变量存储于堆内存。

    1.1K20

    符合 Python 风格的对象

    这篇文章主要介绍自定义类的一些特殊方法,来让类的行为跟真正的 Python 对象一样。 类的特殊方法 类的特殊方法是为了被解释器调用,目的是可以将一些内置的方法用在对象上。...Python 有一个内置 repr 函数,将一个对象用字符串形式表示出来,通过调用 __repr__ 这个特殊方法来实现的。同样, str() 是通过调用 __str__ 实现的。...该装饰器定义了该方法是操作类,而不是操作实例,因此类方法的第一个参数时类本身,而不是实例。按照约定,类方法的第一个参数名为 cls 。classmethod 最常见的用途是定义备选构造方法。...staticmethod:即静态方法。该装饰器也会改变方法的调用方式,但第一个参数不是特殊的值。静态方法就是普通的函数,只是碰巧在类的定义体中,所以无法引用类或对象的属性。...使用 __slots__ 类属性节省空间 在 Python 中,唯一节省内存的数据结构是元组,所以 __slots__ 属性的实现方法是让解释器在元组中存储实例属性,而不是字典。

    55630

    就凭这3点,可以完全理解Python的类方法与静态方法

    从以上3个方法我们已经可以得出classmethod方法与staticmethod的区别,下面总结一下: 4....总结 (1)共同点 classmethod方法与staticmethod方法的共同点只有一个,就是调用时,既可以使用类实例,也可以直接用类本身调用。所以从调用上,根本分不出是类方法,还是静态方法。...而静态方法其实就是一个寄居蟹,完全不属于它的宿主。只是寄居在类中。换句话说,直接将静态方法从类中移出来作为独立的函数,完全不需要修改一行代码就可以直接运行。...所以为了实现这种全局调用的效果,Java类提供了静态方法,可以通过MyClass.process(...)的形式在其他类访问MyClass中的process方法。...如果模块中有大量的独立函数,而且这些独立函数的功能可能完全不同,就显得比较乱,所以通常的做法是将这些独立函数作为Python类的静态方法,将同一类型的独立函数放到一个类中,这样就会让整个代码结构显得更有调理

    1.4K11

    详解 Python 方法之类方法 & 静态方法

    很巧的是在前面定义的类 Sample 中就有 language 这个属性,于是在调用这个函数的时候,就直接将该类对象作为方法 get_class_attr() 的参数。...这里需要我们注意的是,@classmethod 所装饰的方法的参数中,第一个参数不是 self,这个和我们常规认识中的类的方法有所区别。这里使用了参数 cls,这是习惯的写法,当然用其它的也可以。...:C++ 通过上面的运行结果我们可以看到,不管是通过类还是实例来执行 get_class_attr() 得到的结果都是类属性的值,这说明装饰器 @classmethod 所装饰的方法,它的参数 cls...至此,「类方法」 的定义就出来了:类方法,就是在类里面定义的方法。该方法由装饰器 @classmethod 装饰,其第一个参数 cls 引用的是这个类对象,即将类本身作为作为引用对象传到这个方法里。...但是这不是简单的移动,还要在函数的前面加上 @staticmethod 装饰器,并且要注意的是,虽然这个函数在类的里面,但是跟别的方法是不一样的,它的第一个参数也不是 self,当我们要使用它的时候,可以通过实例调用

    1.7K10

    #抬抬小手学Python# 类函数、成员函数、静态函数、抽象函数、方法伪装属性

    @classmethod def class_method(cls): print("class_method 是类方法,类名直接调用") # 类方法不可以调用类内部的对象变量...@classmethod def class_method(cls): 同时类函数在调用的时候,可以通过 类名. 的形式进行调用,也可以通过 对象....的形式调用,不过这两种调用都只是将类传递到了函数内部,不存在差异。 类函数不能调用实例变量,只能调用类变量,所谓类变量就是在类中独立声明,不在任何函数中出现的变量。...__new__ () 也就是 @classmethod 的一个主要用途是作为构造函数。...如果希望在子类中调用父类的属性或者函数,请使用 父类名. 的形式实现。

    1.1K30

    Python3.6.5标准库文档(完整中文版)—内置函数(三)

    请注意,类是可调用的 (调用一个类返回一个新的实例); 如果它们的类有一个call()方法,则实例可以被调用。...@classmethod 将方法转换为类方法。 类方法将类作为隐式第一个参数接收,就像实例方法接收实例一样。...该@classmethod表单是一个函数装饰器 - 有关详细信息,请参阅函数定义中的函数定义说明。 它可以在类(如C.f())或实例(如C().f())上调用。该实例被忽略,除了它的类。...如果为派生类调用类方法,则派生类对象将作为隐含的第一个参数传递。 类方法与C ++或Java静态方法不同。如果你想要这些,请参阅staticmethod()本节。...有关类方法的更多信息,请参阅标准类型层次结构中关于标准类型层次结构的文档。

    63210

    Python装饰器是个什么鬼?

    事实上,Python 对某个对象是否能通过装饰器( @decorator)形式使用只有一个要求:decorator 必须是一个“可被调用(callable)的对象。 函数自然是“可被调用”的对象。...但作为装饰器的类需要包含__call__()方法。...类中常用的@staticmethod和@classmethod •@classmethod 装饰的类方法•@staticmethod装饰的静态方法•不带装饰器的实例方法 用@classmethod修饰的方法...@classmethod修饰的方法class_foo()需要通过cls参数传递当前类对象。@staticmethod修饰的方法定义与普通函数是一样的。...self和cls的区别不是强制的,只是PEP8中一种编程风格。self通常用作实例方法的第一参数,cls通常用作类方法的第一参数。即通常用self来传递当前类对象的实例,cls传递当前类对象。

    88410

    答疑《python的CLS》

    除了多了一个classmethod装饰器,其实还有括号里面的参数形式发生类变化,由self变成了cls,虽然我们之前说过()里面的参数随便叫什么都可以,self只不过是我们约定俗成的一种写法,但是在这里...,从self变成了cls并不是形式上的变化,而是根本上的变化。...self所代表的其实是对象的指针,它可以指向任意一个对象。在实例化对象的时候self就会变成对象实例。 cls所代表的东西代表的其实是一个类本身,它可以用来调用类自己的属性和类自己的方法。...可以正常访问到属性,这点其实和self是一样的,普通方法访问类中的属性的时候也是借助于self来访问的。 下面接着看,如果我需要在h2里面调用h1方法呢? 直接写h1?...cls这个参数表示自身类,它的作用有:调用类的属性,类的方法,实例化对象等。 最后再说一下:类方法可以同时被对象和类本身调用哦!

    2.7K32

    Python入门之面向对象编程(四)Python描述器详解

    定义:从描述器的创建来说,一个类中定义了__get__、__set__、__delete__中的一个或几个,这个类的实例就可以叫做一个描述器。...中的实例 obj是调用描述器的类a中的实例 type是调用描述器的类A value是对这个属性赋值时传入的值,即上面的30 上面的代码逻辑如下 a.m访问描述器,调用__get__方法 三次打印分别调用了...其实从显示的结果我们可以看出,静态方法和类方法用字典调用得到的其实分别是staticmethod和classmethod两个类的对象,这两个类其实是定义描述器的类,所以用字典访问的两个方法得到的都是描述器对象...静态方法相当于不自动传入实例对象作为方法的第一个参数,类方法相当于将默认传入的第一个参数由实例改为类 使用@classmethod后无论类调用还是实例调用,都会自动转入类作为第一个参数,不用手动传入就可以调用类属性...,而没有@classmethod的需要手动传入类 既不用@classmethod也不用@staticmethod则类调用时不会自动传入参数,实例调用时自动传入实例作为第一个参数 所以说加@classmethod

    87570

    - 装饰器与类的装饰器

    是不是非常类似在类中定义一个局部函数并调用的例子?其实装饰器就是有些类似这样的操作,只不过被装饰器调用的函数是通过 参数 的形式传进去,并在 b() 函数中执行。...,不返回就无法执行调用) 装饰器的用法在我们日常工作中,装饰器的使用方法有两种。...类中的装饰器 类的装饰器 - classmethodclassmethod 的功能:可以将类函数不经过实例化即可直接被调用classmethod 的用法:示例如下@classmethoddef func...(cls, ...): todo # >>> cls 替代普通类函数中的 self ;# >>> 变更为 cls ,表示当前的类# >>> self 代表的是 实例化对象,所以只有通过实例化后...装饰器 的 函数 内,是无法调用普通的 带有 self 的函数的但是在普通的带有 self 的类函数内,是可以调用带有 classmethod 装饰器 的 函数的 类的装饰器 - staticmethodstaticmethod

    14521

    es6 class

    在类中定义的方法,都会被实例继承,   如果在一个方法前加上static 关键字,就表示该方法   不会被实例继承,而是直接通过类来调用。   ...    }   }   子类必须在constructor 方法中调用super 方法,否则新建实例时会报错,因为子类没   有自己的 this 对象,而是继承父类的this 对象,而活对其进行加工,如果不调用...1.super 作为函数调用的时,代表父类的构造函数。子类的构造函数必须     执行一次super函数。       ...,在普通方法中,指向父类的原型对象,在       静态方法中指向父类。       ...15.实例的__proto__属性   子类属性的__proto__属性的__proto__属性,指向父类实例的__proto__,也就是说   子类原型的原型,是父类的原型。

    595100

    python面向对象编程指南 pdf_python面向对象的三个基本特征

    抽象是隐藏多余细节的艺术。在面向对象的概念中,抽象的直接表现形式通常为类。虽然Python是解释性语言,但是它是面向对象的,从设计之初就已经是一门面向对象的语言。...当一个类定义完之后,就产生了一个类对象。类对象支持两种操作:引用和实例化。引用操作是通过类对象去调用类中的属性或者方法,而实例化是产生出一个类对象的实例,称作实例对象。...类方法:是类对象所拥有的方法,需要用修饰器”@classmethod”来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以”cls”作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以...从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;而实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性...并且若SuperClass1和SuperClass2中有同名的方法,通过子类的实例化对象去调用该方法时调用的是第一个父类中的方法。 七.

    75221

    python类:类方法和静态方法

    参考链接: Python中的类方法与静态方法 http://blog.csdn.net/pipisorry/article/details/49516185 面相对象程序设计中,类方法和静态方法是经常用到的两个术语...逻辑上讲:类方法是只能由类名调用;静态方法可以由类名或对象名进行调用。在C++中,静态方法与类方法逻辑上是等价的,只有一个概念,不会混淆。在python中,方法分为三类实例方法、类方法、静态方法。...在python中,两种方法的主要区别在于参数 类内部普通的方法,都是以self作为第一个参数,代表着通过实例调用时,将实例的作用域传入方法内;@classmethod以cls作为第一个参数,代表将类本身的作用域传入...无论通过类来调用,还是通过类的实例调用,默认传入的第一个参数都将是类本身@staticmethod不需要传入默认参数,类似于一个普通的函数 实例方法隐含的参数为类实例self; 类方法隐含的参数为类本身...逻辑上类方法应当只被类调用,实例方法实例调用,静态方法两者都能调用。 而实际上,python实现了一定的灵活性使得类方法和静态方法都能够被实例和类二者调用。 皮皮blog 示例 示例1 #!

    88010

    Caché JSON 使用JSON适配器

    Exporting and Importing从JSON序列化或序列化到JSON的任何类都需要子类%JSON.Adaptor,它包括以下方法: %JSONExport()将启用JSON的类序列化为JSON...%JSONImport()将JSON作为字符串或流导入,或者作为%DynamicAbstractObject的子类导入,并返回启用JSON的类的实例。...以前,在未修改的Model.Event类的实例上调用%JSONExport(),并返回以下JSON字符串: {"Name":"Global Summit","Location":{"City":"Boston...Reference -覆盖类参数%JSONREFERENCE。格式化JSON%JSON.ForMatter是一个具有非常简单接口的类,允许将动态对象、数组和JSON字符串格式化为更易于阅读的表示形式。...所有方法都是实例方法,因此始终从检索实例开始: set formatter = ##class(%JSON.Formatter).

    1.9K10
    领券