鱼C论坛

 找回密码
 立即注册
查看: 1296|回复: 8

[已解决]麻烦大家看一个小问题

[复制链接]
发表于 2021-4-2 19:42:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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'


最佳答案
2021-4-2 20:08:44
其实是可以的,这种 类名.方法名() 或 类名.属性 的写法、用法,叫 “静态方法/属性”。
在Java中,是有 static 关键字,修饰的。
在Python中,则有 @staticmethod 和 @classmethod 两种。它们都可以 类名.方法名() 这样用。
比如,
  1. class Person:
  2.     def __init__(self, name, age):
  3.         self.name = name
  4.         self.age = age
  5.       
  6.     @staticmethod
  7.     def isAdult(age):
  8.         return age > 18

  9. print('你的成年了么?—' , Person.isAdult(22))
复制代码

至于如何“实例化”,简单点可以理解为:由 static 修饰的 方法或属性,已经提前进行了“实例化”。

ps: 暂时知道怎么用就好了。哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-2 19:50:34 From FishC Mobile | 显示全部楼层
貌似   实例化时,self不用传,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-2 19:53:33 From FishC Mobile | 显示全部楼层
通过类名调用普通方法可以手动传进实例参数:
  1. class School():
  2.     sex='male'
  3.     def printname(self):
  4.         self.name='11'
  5.         print(self.name)

  6. School.printname(School())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-2 20:02:14 | 显示全部楼层
class School():
    sex='male'
    def printname(self):#printname()函数的参数是self,所以他是实例方法,必须实例后才能调用。如果想用类名调用函数,参数要用cls,或者不带参数
        self.name='11'
        print(self.name
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-2 20:08:44 | 显示全部楼层    本楼为最佳答案   
其实是可以的,这种 类名.方法名() 或 类名.属性 的写法、用法,叫 “静态方法/属性”。
在Java中,是有 static 关键字,修饰的。
在Python中,则有 @staticmethod 和 @classmethod 两种。它们都可以 类名.方法名() 这样用。
比如,
  1. class Person:
  2.     def __init__(self, name, age):
  3.         self.name = name
  4.         self.age = age
  5.       
  6.     @staticmethod
  7.     def isAdult(age):
  8.         return age > 18

  9. print('你的成年了么?—' , Person.isAdult(22))
复制代码

至于如何“实例化”,简单点可以理解为:由 static 修饰的 方法或属性,已经提前进行了“实例化”。

ps: 暂时知道怎么用就好了。哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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'
结果运行是对的。不再出现报错。你看看我解释的对不对?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-3 18:01:05 | 显示全部楼层
阿奇_o 发表于 2021-4-2 20:08
其实是可以的,这种 类名.方法名() 或 类名.属性 的写法、用法,叫 “静态方法/属性”。
在Java中,是有 s ...

我可以这样理解吗
使用 类名.方法名() 这种方法 需要在方法前加上  @staticmethod 和 @classmethod 是吗?
这种方法不需要实例化了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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



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

实际上,都有 实例化的内部过程,无论显式或隐式的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-3 18:33:59 | 显示全部楼层
阿奇_o 发表于 2021-4-3 18:11
只是看起来不要实例化而已,写法上的区别罢了。

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

好的,谢谢您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-17 18:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表