产品执行码暂缺 发表于 2022-6-21 16:17:37

类的属性引用_函数体 基础问题



这个people类的属性引用a = people.spaek返回了一个函数对象speak(),()中参数是self.
为什么传入类名people后会有图中所示的结果?
实例属性self.name和self.age的值为什么就和类属性name,age一样了?

临时号 发表于 2022-6-21 16:36:40

首先你a(people)调用了a函数,将people传了进去
此时self = people
所以,你打印self.name和self.age实际上是打印people.name和people.age
而people.name='human'
people.age=0
所以打印了human和0

产品执行码暂缺 发表于 2022-6-21 16:42:29

临时号 发表于 2022-6-21 16:36
首先你a(people)调用了a函数,将people传了进去
此时self = people
所以,你打印self.name和self.age实际上 ...

那也就是说
a()的参数只能是 传入一个 类属性包含name , age 的类
比如
class people1:
    name = 'fgae'
    age=314
a(people1)
对么?

临时号 发表于 2022-6-21 16:47:10

本帖最后由 临时号 于 2022-6-21 16:50 编辑

产品执行码暂缺 发表于 2022-6-21 16:42
那也就是说
a()的参数只能是 传入一个 类属性包含name , age 的类
比如


不对
你的people类中还有一个__init__函数,忘了吗?
这个__init__函数就是用来做初始化的
比如,你可以这么写
b = people('xxx',18,30)
a(b)
这里你直接可以用people这个类名调用__init__函数,然后进行初始化
然后,你再a(b)

产品执行码暂缺 发表于 2022-6-21 16:57:20

临时号 发表于 2022-6-21 16:47
不对
你的people类中还有一个__init__函数,忘了吗?
这个__init__函数就是用来做初始化的


您说这个创建实例对象的方法我明白

我是说如果采用属性引用的方式,返回一个类中的函数对象 a = people.speak
那么这个函数对象a想要作为函数体执行,给它的参数就得是 一个包含对应属性的类(可以是其他的新类)
比如
class people1:
    name = 'fgae'
    age=314
    def __init__(self,nn,aa):
      self.name = nn
      self.age = aa
    def ss(self):
      print(self.name,self.age)


class people:
    name = 'xxx'
    age = 31
   
a = people1.ss
a(people)

结果是 xxx 31

Stubborn 发表于 2022-6-22 13:50:45

实在不动,你就这样看
a = people1.ss
a是一个函数,函数接受一个参数。这个参数必须要有name属性,和age属性。

产品执行码暂缺 发表于 2022-6-23 11:07:44

Stubborn 发表于 2022-6-22 13:50
实在不动,你就这样看
a = people1.ss
a是一个函数,函数接受一个参数。这个参数必须要有name属性,和age ...

嗯嗯 是的 就是得传入一个参数,这个参数能匹配上ss函数的参数要求:具有name,age属性

感谢指点
页: [1]
查看完整版本: 类的属性引用_函数体 基础问题