python中self的意思_python里self是什么

首先我们要搞明白Python的类中为要什么要用到self这个单词呢,为什么不用"zhangsan"、"lisi"这样的名字呢,这可定有他的用意。查Google翻译解释:self

名词的解释:自;自我;自己

那么问题来了,这里的自己指代的到底是谁,下面听我详细分解。

分析

测试代码以一下这个代码及其它的扩充为基础,先贴代码,为了好理解,别说了半天不知道我在说什么。class A():

def song(one):

print(one)

def sing(self,one):

print(one)

1、首先要搞清楚的一个问题 a=A()与a=A,这两个赋值之间的区别a=A()

print(a)

a=A

print(a)

print(A)

结果如下:

分析:

a=A()  是有地址的,这说明他是一个实体,比如 int a  中的 a 一样

a=A    是没有地址的,发现他和A打印的结果一毛一样,这说明他就是A,也就是一个类名,

等价于上一句中 int a 中的 int

那么也就是说下面这两语句是等价的

b=A()   与   b=a()

------------------------------------------------------------------------

通过上面的分析,我们知道,a=A()相当于把 A 给实例化了,什么叫实例化呢,类比与 int a ,

int 什么都不能做,即 int 不能被赋值,不能进行算术操作等等,但是 a 可以(其实这里的 A 与 int

是一样的,追溯到C语言,类只不过是一种自定义的结构变量而已,只不过功能更加强大)。

那具体怎么个实例发呢?

2、self 到底指代的是谁class A():

def song(one):

print(one)

def sing(self,one):

print(one)

a=A()

A.sing(a,"hello")  #注意这条语句

a.sing("hello")

打印结果:

hello

hello

-------------------------------

A.sing("hello")

错误信息:

TypeError: sing() missing 1 required positional argument: 'one'

提示没有给 one 赋值

--------------------------------

a.song("hello")

错误信息:

TypeError: song() takes 1 positional argument but 2 were given

那么问题来了,多给了一个什么参数,为什么会多给呢?

--------------------------------

把类A改一下

class A():

def song(one,two):   #注意这里多给song了一个参数

print(one)

a.song("hello")   //这里的参数  "hello"赋给了 two

print(a)

打印结果:

是不是很奇怪,为什么a.song("hello")返回的是  实例  a  的地址呢?

从这个例子中你就可以发现,实际上 a.sing(“hello”) 等价于 A.sing(a,“hello”),而self就是实例 a 自己,而且你发现 self ,也可以用别的单词来代替。

通过这段分析,我们简单的知道了,类中的方法第一个参数必须是 self ,不然实例无法正确调用类中的方法,也就是说,如果方法中第一个参数不是 self(广义的),那么这个方法是没有任何价值的,因为实例无法调用它,一个无法被调用的方法真不知道有什么用。

参数前面的 selfx=6

class A():

def sing(self):

self.x=10

def mutl(self):

y=10*x

print(y)

a=A()

a.mutl()

这里先猜一下结果,到底会打印 60 呢,还是 100 呢?要弄清这个问题,就要先弄清 mutl() 中的 x 到底是哪一个,先看结果在分析。

结果是:60

为什么不调用类内部的 x 参数而跑去调用类外的 x 呢?还是那个问题,self 到底指代的是谁,self 就是 a 本身,那么问题就很明显了,mutl() 方法中的 x 前面没有加 self 所以他调用的不是实例(注意这里说的是实例,而不是类)自身的参数。

到这里我想你大概明白了,参数前面有self和没self的区别了,简单说,带self的参数是人家实例自身的,不带self的,爱谁谁,实例不管。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: self.__dict__是Python一个特殊的属性,它用于获取对象的属性字典。当我们在类定义一个实例方法时,方法的第一个参数通常是self,它代表当前对象。通过self.__dict__,我们可以访问当前对象的所有属性,包括实例变量和方法。这个属性字典是一个Python字典对象,它将属性名映射到属性值。我们可以使用这个属性字典来动态地添加、修改和删除对象的属性。 ### 回答2: 在Pythonself.__dict__是一个字典对象。它包含了类实例的所有属性及其对应值,其key为属性名,value为属性值。 在Python,类实例可以动态的增加、删除和修改属性。你可以通过访问self.__dict__ 来获取当前所有的属性信息。例如: class MyClass: def __init__(self, x, y): self.x = x self.y = y obj = MyClass(1, 2) print(obj.__dict__) # {'x': 1, 'y': 2} 上述代码self.__dict__的值为{'x': 1, 'y': 2},包含了类MyClass实例obj的所有属性的名称及对应的值。 除了访问属性外,你也可以通过self.__dict__来动态增加属性。例如: class MyClass: def __init__(self, x, y): self.x = x self.y = y obj = MyClass(1, 2) obj.__dict__['z'] = 3 print(obj.__dict__) # {'x': 1, 'y': 2, 'z': 3} 上述代码,我们动态的增加了一个属性z,并将其赋值为3。最后打印出obj.__dict__的值为{'x': 1, 'y': 2, 'z': 3}。 需要注意的是,在大多数情况下,我们应该使用类的属性访问方式。例如,在上述代码,访问obj的属性x应该使用obj.x而不是obj.__dict__['x']。因为这样写更加易于阅读,也可以在IDE得到更好的代码提示。 总之,self.__dict__ 是一个很有用的属性,可以让我们动态的查看和修改类实例的属性信息。但要注意,这种方式会使代码更难以理解和维护,应该尽量避免在实际项目使用。 ### 回答3: 在Pythonself.__dict__是一个Python特殊的变量,它保存着实例对象的变量名和变量值之间的映射关系,可用于查看和修改实例对象的属性。 当我们创建一个类的实例时,实例对象会自动继承类的各种属性和方法。这些属性和方法之间的关系是通过self.__dict__来实现的。__dict__是一个字典,其键是属性名,值是属性值。 我们可以通过self.__dict__来访问实例对象的属性,并且也可以用它来修改属性值。例如,如果我们创建了一个名为person的类,其包含name和age两个属性,可以通过以下代码访问它们: ``` class Person: def __init__(self, name, age): self.name = name self.age = age p = Person("Tom", 20) print(p.__dict__['name']) # 输出 'Tom' print(p.__dict__['age']) # 输出 20 p.__dict__['name'] = 'Mike' print(p.name) # 输出 'Mike' ``` 然而,在实际编程,我们很少直接使用self.__dict__来访问实例对象的属性。通常,我们使用"."操作符来访问实例对象的属性,例如"p.name"。这是因为"."操作符会自动转换成相应的字典操作(即self.__dict__['name'])。 除此之外,我们还可以使用dir()函数来查看实例对象所拥有的所有属性和方法,该函数实际上调用了self.__dict__和类的__dict__。例如,我们可以通过以下代码查看实例对象p所拥有的所有属性和方法: ``` print(dir(p)) ``` 总之,self.__dict__是一个Python特殊变量,保存着实例对象的变量名和变量值之间的映射关系,可以用于查看和修改实例对象的属性。虽然我们很少直接使用该变量来访问实例对象的属性,但它为我们提供了一种更底层的实现方法,使我们能够更好地理解Python类和实例对象之间的关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值