麻烦大家看一个小问题
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'
貌似 实例化时,self不用传, 通过类名调用普通方法可以手动传进实例参数:class School():
sex='male'
def printname(self):
self.name='11'
print(self.name)
School.printname(School()) class School():
sex='male'
def printname(self):#printname()函数的参数是self,所以他是实例方法,必须实例后才能调用。如果想用类名调用函数,参数要用cls,或者不带参数
self.name='11'
print(self.name 其实是可以的,这种 类名.方法名() 或 类名.属性 的写法、用法,叫 “静态方法/属性”。
在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:} 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'
结果运行是对的。不再出现报错。你看看我解释的对不对? 阿奇_o 发表于 2021-4-2 20:08
其实是可以的,这种 类名.方法名() 或 类名.属性 的写法、用法,叫 “静态方法/属性”。
在Java中,是有 s ...
我可以这样理解吗
使用 类名.方法名() 这种方法 需要在方法前加上@staticmethod 和 @classmethod 是吗?
这种方法不需要实例化了 dandan0523 发表于 2021-4-3 18:01
我可以这样理解吗
使用 类名.方法名() 这种方法 需要在方法前加上@staticmethod 和 @classmethod 是 ...
只是看起来不要实例化而已,写法上的区别罢了。
实际上,都有 实例化的内部过程,无论显式或隐式的。
阿奇_o 发表于 2021-4-3 18:11
只是看起来不要实例化而已,写法上的区别罢了。
实际上,都有 实例化的内部过程,无论显式或隐式 ...
好的,谢谢您
页:
[1]