马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 shatanzongcai 于 2020-7-29 21:51 编辑
各位鱼油晚上好。我遇到了一个问题:class People(object):
type = "human"
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
#info = [name, age, gender]
print(locals())
def __str__(self):
print(locals())
#print(info)
return f"这个人的名字是:{self.name},年龄是:{self.age},性别是:{self.gender}"
p = People("marry", 16, "female")
print(p)
暂时不看我注释掉的那两行,得出来的结果是:>>>{'self': <__main__.People object at 0x00000286D0136400>, 'name': 'marry', 'age': 16, 'gender': 'female'}
>>>{'self': <__main__.People object at 0x00000286D0136400>}
>>>这个人的名字是:marry,年龄是:16,性别是:female
也就是说self.属性即使是定义在一个方法中,也可以在另外一个方法(非静态方法和类方法)中调用,这么看来和type这个类属性的作用域是一样的。但是把注释的两行拿掉之后,就会报错,报错的原因是info没有定义。在这里info的作用域就限定在了__init__里面。
可是当我使用locals()的时候,我看到name,age,gender是在__init__方法里,它们并不存在在__str__方法里,为何__str__可调用呢?
而且当我在class的最后打印locals() 以上略
def __str__(self):
print(locals())
<font color="Red">#print(info)</font>
return f"这个人的名字是:{self.name},年龄是:{self.age},性别是:{self.gender}"
print(locals())
返回的是:>>>{'__module__': '__main__', '__qualname__': 'People', 'type': 'human', '__init__': <function People.__init__ at 0x0000025ED3F5D700>, '__str__': <function People.__str__ at 0x0000025ED3E7F310>}
>>>{'self': <__main__.People object at 0x00000286D0136400>, 'name': 'marry', 'age': 16, 'gender': 'female'}
>>>{'self': <__main__.People object at 0x00000286D0136400>}
>>>这个人的名字是:marry,年龄是:16,性别是:female
返回中并没有并没有出现name之类的。
所以self.属性的作用域是整个类的内部吗?为什么可以这样呀?
而且明明我把print(locals())写在类的最后,为什么反而它是第一个被打印出来的呢?
类实例化的时候会把成员函数变成绑定后的方法。
绑定后的方法是什么,给你个例子自己感受下: >>> from types import MethodType as method
>>> method(abs, 0)
<bound method abs of 0>
>>> _()
0
>>> HelloFunction = method(print, "Hello world")
>>> HelloFunction()
Hello world
|