我解释一下python的类方法为啥要写一个self参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我解释一下python的类方法为啥要写一个self参数相关的知识,希望对你有一定的参考价值。
类(class)初始化之后会得到实例(instance)。self就是用于代表初始化的到的实例。
明确地写一个self参数,使得类的方法(method)和普通的函数(function)本质上没有差异,所有的输入参数都显示地传递到方法/函数当中。
当然作为类的方法,作用的对象一定会是实例,因而在Python的设计之初,完全可以设计成self不作为一个参数,但是那样就需要一个关键字代表实例,比如在javascript中就是this。
然而Python的哲学是"Explicit is better than implicit.",显示要比隐示好,因此Python类的方法需要一个self参数代表实例是符合逻辑的。 参考技术A self 表示类实例自身,相当于C++中的this
在类中用self可以引用类实例的成员,方法
如
class test:
def printhello(self):
print("hello")
def output(self):
self.printhello()
output中就使用self调用了类本身的printhello方法 参考技术B 这是对前面一个php程序员问python方法为什么要手写一个self的回答,当时那个帖非常的热闹,但是下面没有一个回复讲到要点,等我有空,已经找不到原帖了。
原因有多重。首先是python中几乎所有的东西的一级对象(一级对象的定义),method也不例外,比如你写一个:
class X:
def f(self, a, b):
...
那么可以这样引用f:
X.__dict__['f']
或者
X.f.__func__
现在问题来了,得到f以后怎么调用?f是一个方法,方法必须作用于对象。如果x是一个X对象,我们可以x.f(...),但是如果是以上面的方式得到的f呢?怎么f让作用于某个对象?最直观的方法就是和参数一起传递进去。
当然的限不同的设计也可以满足上面制。比如不要手写的self参数,增加this关键字,增加一个调用f个格式。这样的设计和pep20第二条不符合。
为理解python的self,不妨对比一下ruby和javascript。ruby的方式是方法不是一级对象,所以绕过了这个问题。javascript没有类,方法在调用时this会绑定到方法所属的对象,函数调用时this绑定到window,函数做构造器调用时this绑定到新对象。这么多规则,比Python复杂。
为啥python类的私有属性允许我赋值? [复制]
【中文标题】为啥python类的私有属性允许我赋值? [复制]【英文标题】:Why does a private attribute of python class allow me to assign a value? [duplicate]为什么python类的私有属性允许我赋值? [复制] 【发布时间】:2014-03-01 12:11:21 【问题描述】:我有一个具有私有属性的类
class DoGood():
__prv = "i m private"
def __init__(self):
self.default_string = self.__prv
def say_it_aloud(self):
print self.default_string
我正在尝试从 python-cli 访问私有属性
>>> from sample import DoGood
>>> obj = DoGood()
>>> obj.__prv
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: DoGood instance has no attribute '__pro'
由于它是私有的,我无法访问它但是当我尝试分配一个值时,我可以做到
>>> obj.__prv = "changed in subclass"
>>> obj.say_it_aloud()
i m private
但是类对象内部的值并没有改变。但是为什么我能够分配它是否有任何目的
【问题讨论】:
obj.__pro
是一个错字。
您创建了一个新属性,就像您创建了obj.someOtherAttribute = "blah"
。
这并不是真正的复制品,尽管它是相关的。这个问题要具体得多。
感谢 BrenBarn ppl 阅读问题并回答,请不要浏览并回答
【参考方案1】:
您正在为您为该类创建的实例分配一个新属性。它不会改变 __prv 属性的值。
print DoGood._DoGood__prv # access a private attribute.
仍会输出“我是私人的”
【讨论】:
不是因为它是私有的,而是因为它是一个类属性。 是的@perreal。即使它是一个实例变量,私有属性也会被映射为 _ClassName__attrname,所以如果我们重新分配该属性,它不会改变实际属性。以上是关于我解释一下python的类方法为啥要写一个self参数的主要内容,如果未能解决你的问题,请参考以下文章