python中self _init_(self,param1,param2)问题
ringa_lee
ringa_lee 2017-04-18 10:20:33
0
4
722

昨天的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_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的时候就会提示找不到相应的变量。
解释下用途 区别

ringa_lee
ringa_lee

ringa_lee

모든 응답(4)
大家讲道理

무엇을 묻고 있나요? 잘 모르겠어요~

Peter_Zhu

그런 식으로 방문하지 마세요. 튜토리얼은 기본 구현이 어떻게 구현되는지 알려드리기 위한 것입니다.

迷茫

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

이 두 링크를 통해 귀하의 질문에 대한 답변을 얻을 수 있습니다

黄舟

특수변수 명명

1. 단일 밑줄로 시작하는 _xx는 보호 유형 변수를 나타냅니다. 즉, 보호 유형은 자체 및 하위 클래스의 액세스만 허용할 수 있습니다. "from M 가져오기"를 사용하는 경우와 같이 내부 변수가 표시되면 밑줄로 시작하는 개체를 가져오지 않습니다.

2. __xx 이중 밑줄은 개인 유형 변수를 나타냅니다. 클래스 자체에만 접근이 허용됩니다. 하위 클래스라도 클래스 속성(클래스 변수)의 이름을 지정하는 데 사용할 수 없습니다. 호출되면 이름이 변경됩니다. (FooBar 클래스 내에서 __boo는 self._FooBar__boo와 같이 _FooBar__boo가 됩니다.)

3. __xx__는 특별한 메소드를 정의합니다. init, __import__ 또는 file과 같은 사용자 제어 네임스페이스의 변수 또는 속성입니다. 문서화된 경우에만 사용하고, 그러한 변수를 직접 정의하지 마십시오. (즉, 파이썬 내부적으로 정의된 변수 이름입니다.)

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿