您的位置:首页技术文章
文章详情页

python中self _init_(self,param1,param2)问题

【字号: 日期:2022-09-17 14:06:33浏览:23作者:猪猪

问题描述

昨天的self _init_(self,param1,param2)问题class Ball:

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

问题解答

回答1:

你是要问什么?不太明白哈~

回答2:

永远不要那么访问 教程只是为了告诉你底层如何实现的

回答3:

http://greybeard.iteye.com/bl...http://python3-cookbook.readt...

这两个链接可能可以解答你的疑问

回答4:

特殊变量命名

1、 _xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如: 当使用“from M import”时,不会将以一个下划线开头的对象引入 。

2、 __xx 双下划线的表示的是私有类型的变量。只能允许这个类本身进行访问了,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo)

3、 __xx__定义的是特列方法。用户控制的命名空间内的变量或是属性,如init , __import__或是file 。只有当文档有说明时使用,不要自己定义这类变量。 (就是说这些是python内部定义的变量名)

标签: Python 编程