Rumah  >  Soal Jawab  >  teks badan

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_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_leeringa_lee2740 hari yang lalu690

membalas semua(4)saya akan balas

  • 大家讲道理

    大家讲道理2017-04-18 10:22:33

    Apa yang anda tanya? Saya kurang faham~

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:22:33

    Jangan sekali-kali melawat seperti itu. Tutorial ini hanya untuk memberitahu anda bagaimana pelaksanaan asas dilaksanakan

    balas
    0
  • 迷茫

    迷茫2017-04-18 10:22:33

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

    Dua pautan ini mungkin menjawab soalan anda

    balas
    0
  • 黄舟

    黄舟2017-04-18 10:22:33

    Penamaan pembolehubah khas

    1. _xx bermula dengan garis bawah tunggal mewakili pembolehubah jenis yang dilindungi. Iaitu, jenis yang dilindungi hanya boleh membenarkan akses dengan sendirinya dan subkelas. Jika pembolehubah dalaman ditanda, seperti: Apabila menggunakan "dari M import", objek yang bermula dengan garis bawah tidak akan diimport.

    2. __xx garis bawah berganda mewakili pembolehubah jenis peribadi. Hanya kelas itu sendiri dibenarkan untuk diakses Malah subkelas tidak boleh digunakan untuk menamakan atribut kelas (pembolehubah kelas Nama ditukar apabila dipanggil (di dalam kelas FooBar, __boo menjadi _FooBar__boo, seperti self._FooBar__boo)

    3. __xx__ mentakrifkan kaedah khas. Pembolehubah atau atribut dalam ruang nama yang dikawal pengguna, seperti init, __import__ atau fail. Gunakan hanya apabila didokumenkan, jangan tentukan sendiri pembolehubah tersebut. (Maksudnya, ini adalah nama pembolehubah yang ditakrifkan secara dalaman dalam python)

    balas
    0
  • Batalbalas