开发者社区> 问答> 正文

python中self _init_(self,param1,param2)问题?报错

昨天的self   _init_(self,param1,param2)问题
class Ball:
    def setName(tt,name):
        tt.name=name
    def kick(tt):
        print('我是%s,该死的,谁踢我...'%tt.name)
a=Ball()
a.setName('球A')
b=Ball()
b.setName('球B')
c=Ball()
c.setName('球C')
a.kick()
c.kick()
将self改为其他变量名tt不影响结果

class Ball:
    def __init__(self,name):
        self.name=name
    def kick(self):
        print('我是%s,该死的,谁踢我...'%self.name)
b=Ball('土豆')
b.kick()
c=Ball('黄瓜')
c.kick()
注意:_init__(self,name)这个构造函数的左右下划线都是两个。固定格式,不然会报错TypeError: object() takes no parameters   类型错误:对象不接受参数。
前后对比发现是直接调用Ball的,相当于类Ball的自身函数。__init__()是类的构造函数,在建立对象时调用。self是对“对象”自身的引用。内部函数调用,用于初始化对象。
class Ball:
    def __init__(tt,name):
        tt.name=name
    def kick(tt):
        print('我是%s,该死的,谁踢我...'%tt.name)
b=Ball('土豆')
b.kick()
c=Ball('黄瓜')
c.kick()
把self换成其他变量名发现结果不变?
那改与不改究竟有撒区别呢?请理论+实例讲解下。
class Person:
    name='小甲鱼'
p=Person()
print(p.name)

class Person:
    __name='小甲鱼'
p=Person()
print(p._Person__name)
#从外部访问这个变量了,Python在类的内部用_classname__spam替换了__spam,

参考http://blog.csdn.net/doufei_ccst/article/details/9152085   http://blog.csdn.net/gudesheng/article/details/2169038
懂Python的朋友都知道Python把以两个或以上下划线字符开头且没有以两个或以上下划线结尾的变量当作私有变量。私有变量会在代码生成之前被转换为长格式(变为公有)。转换机制是这样的:在变量前端插入类名,再在前端加入一个下划线字符。这就是所谓的私有变量轧压(Private name mangling)。如类A里的__private标识符将被转换为_A__private,这就是上一节出现_A__private和__private消失的原因了。
Python为了保证不能再class之外访问该变量,,Python会在类的内部自动的把你定义的__spam变量的名字替换成为 _classname__spam(注意,classname前面是一个下划线,spam前是两个下划线),Python把这种技术叫做“name mangling”。因此,用户在外部访问__spam的时候就会提示找不到相应的变量。
解释下用途 区别

展开
收起
爱吃鱼的程序员 2020-06-08 16:52:25 669 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    我隐约记得用self只是一个习惯,其实是第一个参数。

    我翻了一下书,是在python学习手册(第四版)中26章‘类代码编写基础’中的‘实例对象是具体的元素’中有说:在类方法函数内,第一个参数(按惯例称为self)会引用正处理的实例对象....

    2020-06-08 16:52:40
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载