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

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

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

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

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

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

代码语言:python
复制
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.1K10

开源图书《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 装饰。

26510

为什么 classmethod 比 staticmethod 更受宠?

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

34550

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

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

6.3K43

符合 Python 风格对象

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

53030

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

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

40410

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

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

1.1K20

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

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

1.6K10

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

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

94730

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

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

60410

Python装饰器个什么鬼?

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

85610

答疑《pythonCLS》

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

2.6K32

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

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

84870

深入浅析python self和cls区别

python self和cls 一句话描述:self(Class)实例化对象,cls就是(或子类)本身,取决于调用那个。...详细介绍 一般来说,要使用某个方法,需要先⚠️实例化一个对象再调用方法。而使用@staticmethod或@classmethod,就可以不需要实例化,直接名.方法名()来调用。...,实例函数,调用方式如下。...用法 相同: @staticmethod和@classmethod都可以直接名.方法名()来调用 区别: 它们使用上来看,@staticmethod不需要表示自身对象self和自身cls参数...而@classmethod因为持有cls参数,可以来调用属性,方法实例化对象等,避免硬编码。

6.5K21

es6 class

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

568100

python方法和静态方法

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

83810

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

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

69421

Caché JSON 使用JSON适配器

Exporting and ImportingJSON序列化或序列化到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.8K10
领券