dandan0523 发表于 2021-4-2 19:42:48

麻烦大家看一个小问题

2. 类对象是在什么时候产生
答:当你这个类定义完的时候,类定义就变成类对象,可以直接通过“类名.属性”或者“类名.方法名()”引用或使用相关的属性或方法。

问题:这是小甲鱼的课后习题,标红的那句话没有错吗?方法调用不是一定要实例化之后才可以吗?以下是我的测试代码:
class School():
    sex='male'
    def printname(self):
      self.name='11'
      print(self.name)

>>> School.sex
'male'
>>> School.printname()
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
    School.printname()
TypeError: printname() missing 1 required positional argument: 'self'

wp231957 发表于 2021-4-2 19:50:34

貌似   实例化时,self不用传,

hrp 发表于 2021-4-2 19:53:33

通过类名调用普通方法可以手动传进实例参数:class School():
    sex='male'
    def printname(self):
      self.name='11'
      print(self.name)

School.printname(School())

huyanmin 发表于 2021-4-2 20:02:14

class School():
    sex='male'
    def printname(self):#printname()函数的参数是self,所以他是实例方法,必须实例后才能调用。如果想用类名调用函数,参数要用cls,或者不带参数
      self.name='11'
      print(self.name

阿奇_o 发表于 2021-4-2 20:08:44

其实是可以的,这种 类名.方法名() 或 类名.属性 的写法、用法,叫 “静态方法/属性”。
在Java中,是有 static 关键字,修饰的。
在Python中,则有 @staticmethod 和 @classmethod 两种。它们都可以 类名.方法名() 这样用。
比如,
class Person:
    def __init__(self, name, age):
      self.name = name
      self.age = age
      
    @staticmethod
    def isAdult(age):
      return age > 18

print('你的成年了么?—' , Person.isAdult(22))
至于如何“实例化”,简单点可以理解为:由 static 修饰的 方法或属性,已经提前进行了“实例化”。

ps: 暂时知道怎么用就好了。哈哈
{:10_297:}

江湖散人 发表于 2021-4-2 20:27:39

class School():
    sex='male'
    def printname(self):
      self.name='11'
      print(self.name)

>>> School.sex
'male'

定义类的时候,School后边不用小括号。
还有printname后边定义得有name的参数。
class School:
    sex='male'
    def printname(self,name):
      self.name='11'
      print(self.name)

>>> School.sex
'male'
结果运行是对的。不再出现报错。你看看我解释的对不对?

dandan0523 发表于 2021-4-3 18:01:05

阿奇_o 发表于 2021-4-2 20:08
其实是可以的,这种 类名.方法名() 或 类名.属性 的写法、用法,叫 “静态方法/属性”。
在Java中,是有 s ...

我可以这样理解吗
使用 类名.方法名() 这种方法 需要在方法前加上@staticmethod 和 @classmethod 是吗?
这种方法不需要实例化了

阿奇_o 发表于 2021-4-3 18:11:56

dandan0523 发表于 2021-4-3 18:01
我可以这样理解吗
使用 类名.方法名() 这种方法 需要在方法前加上@staticmethod 和 @classmethod 是 ...


只是看起来不要实例化而已,写法上的区别罢了。

实际上,都有 实例化的内部过程,无论显式或隐式的。

dandan0523 发表于 2021-4-3 18:33:59

阿奇_o 发表于 2021-4-3 18:11
只是看起来不要实例化而已,写法上的区别罢了。

实际上,都有 实例化的内部过程,无论显式或隐式 ...

好的,谢谢您
页: [1]
查看完整版本: 麻烦大家看一个小问题