Python 调用类方法问题

2019-03-26 16:13:31 +08:00
 shimingzhoudf

class A(object): def func(self,i): print(i)

A.func(None,1)

不用实例化也能调用该方法?这样写法对吗,合理不

2379 次点击
所在节点    Python
10 条回复
j0hnj
2019-03-26 16:15:29 +08:00
没问题。说实话你跑一下不就知道了
pythonbug
2019-03-26 16:43:16 +08:00
Python 菜鸡一只, 水平很低, 说错了请各位大佬指正, 先谢过了.

class A(object):
def func(self, i):
print(i)

@classmethod
def func1(cls, i):
print(i)


A().func(1) # 输出 1, 实例对象调用实例方法, 实例方法的 self 指向实例对象
A.func(None, 1) # 输出 1, 类对象调用实例方法
A.func1(1) # 输出 1, 类对象调用类方法
A().func1(1) # 输出 1, 实例对象调用类方法

我没见过用类对象调用实例方法的例子(应该是我见识少?), 如果要用类对象调用一个方法可以定义一个类方法, 在方法名上加 @classmethod 装饰器, 方法第一个形参一般为 cls
pythonbug
2019-03-26 16:46:04 +08:00
我见识少, 只是觉得用类调用实例方法有点怪, 也不知道是否有啥弊端还是怎样
HelloAmadeus
2019-03-26 18:12:37 +08:00
python 实现就是这样,实例调用方法默认把 self 传进去了,实际的执行的就是类定义的方法.
ipwx
2019-03-26 18:19:04 +08:00
@classmethod 是特殊 decorator,不要以常理笃之。
arischow
2019-03-26 18:20:03 +08:00
instance.method 是糖
jmc891205
2019-03-26 18:22:31 +08:00
这样写法在 Python 中是合法的
但是在日常开发中是不合理的
如果一个类的某个方法和其实例无关,还是加上 classmethod 装饰器吧
yushenglin
2019-03-26 19:05:32 +08:00
这样写是可以的,但是不建议使用,你还可以用类名加私有变量名对私有属性进行修改呢,这在日常工作中不太符合规范,但是能用。
Kilerd
2019-03-26 20:01:53 +08:00
instance.method(parameters)

equals to

Class.method(instance, parameters)
xpresslink
2019-03-27 16:37:00 +08:00
python 有这么用的,比如自己写一个类的工厂函数。
但是最好加上 @staticmethod 装饰。就可以省去第一个位置参数了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/548778

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX