“Sed技巧按日期提取日志”与“Self 参数详解”:页面之间的差异
无编辑摘要 |
小 导入1个版本 |
||
| 第1行: | 第1行: | ||
在Python中,定义类是通过class关键字,class后面紧接着是类名,类名通常是大写开头的单词,紧接着是('要继承的类名'),表示该类是从哪个类继承下来的,可以有多个父类(基类),通常如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类,也可以不写。 | |||
<pre> | <pre> | ||
class F1(object): | |||
def __init__(self,name,age): | |||
self.name = name | |||
self.age = age | |||
f1 = F1('python',27) | |||
这里注意:(1)、__init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。 | |||
(2)、有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去 | |||
--------------------- | |||
</pre> | |||
上面的这个__init__()叫做初始化方法(或构造方法), 在类实例化时,这个方法(虽然它是函数形式,但在类中就不叫函数了,叫方法)会自动执行,<br>进行一些初始化的动作,所以我们这里写的__init__(self,name,age)就是要在创建一个角色时给它设置这些属性。 | |||
参数self有什么用呢? | |||
1.在内存中开辟一块空间指向f1这个变量名 | |||
2.实例化F1这个类首先执行其中的__init__()方法,相当于F1.__init__(f1,'python',27),是为了把'python',27这2个值跟刚开辟的f1关联起来,因为关联起来后,你就可以直接f1.name, f1.age 这样来调用啦。所以,为实现这种关联,在调用__init__方法时,就必须把f1这个变量也传进去,否则__init__不知道要把那2个参数跟谁关联,self其实就是实例化对象f1被当作参数传递了。 | |||
3.所以这个__init__(…)构造方法里的,self.name = name , self.age = age 等等就是要把这几个值存到f1的内存空间里。 | |||
在Python中,类的方法与普通的函数有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。 | |||
虽然你可以给这个参数任何名称,但是强烈建议你使用self这个名称——其他名称都是不赞成你使用的。 | |||
使用一个标准的名称有很多优点——你的程序读者可以迅速识别它,如果使用self的话,还有些IDE(集成开发环境)也可以帮助你。 | |||
给C++/Java/C#程序员的注释Python中的self等价于C++中的self指针和Java、C#中的this参考。 | |||
<pre> | <pre> | ||
#!/usr/bin/python | |||
#-*- coding:utf-8 -*- | |||
#创建实例类Test | |||
class Test(object): | |||
def add(self, a,b): | |||
'''打印输出a +b 的值 ''' | |||
print (a + b) | |||
def display(self): | |||
''' 打印出字符串''' | |||
print 'hello' | |||
test = Test() | |||
test.add(1,3) #调用方法 | |||
test.display() | |||
def addTwo(a,b): | |||
print (a + b) | |||
addTwo(1,2) | |||
''' | |||
4 | |||
hello | |||
3 | |||
''' | |||
声明add()方法时,若不加self,则提示 | |||
Traceback (most recent call last): | |||
File "selff.py", line 15, in <module> | |||
test.add(1,3) #调用方法 | |||
TypeError: add() takes exactly 2 arguments (3 given) | |||
总结: self | |||
1.self在Python里不是关键字。self代表当前对象的地址。 | |||
2.跟java与C++中的this指针作用相似,但是区别在于:python的类方法的第一个参数都必须带self参数。 | |||
Python的类的方法和普通的函数有一个很明显的区别,在类的方法必须有个额外的第一个参数 | |||
(self),但在调用这个方法的时候不必为这个参数赋值(显胜于隐的引发)。Python的类的方法的这个特别的参数指代的是对象本身,而按照Python的惯例,它用self来表示。(当然我们也可以用其他任何名称来代替,只是规范和标准在那建议我们一致使用self) | |||
为何Python给self赋值而你不必给self赋值? | |||
例子说明:创建了一个类MyClass,实例化MyClass得到了MyObject这个对象,然后调用这个对象的方法MyObject.method(arg1,arg2) | |||
,这个过程中,Python会自动转为Myclass.mehod(MyObject,arg1,arg2) | |||
这就是Python的self的原理了。即使你的类的方法不需要任何参数,但还是得给这个方法定义一个self参数,虽然我们在实例化调用的时候不用理会这个参数不用给它赋值。 | |||
class Python: | |||
def selfDemo(self): | |||
print 'Python,why self?' | |||
p = Python() | |||
p.selfDemo() | |||
把p.selfDemo()带个参数如:p.selfDemo(p),得到同样的输出结果 | |||
首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。 | |||
self名称不是必须的,在python中self不是关键词,你可以定义成a或b或其它名字都可以,但是约定成俗,不要搞另类,大家会不明白的。下例中将self改为myname一样没有错误: | |||
class Person: | |||
def __init__(myname,name): | |||
myname.name=name | |||
def sayhello(myname): | |||
print 'My name is:',myname.name | |||
p=Person('Bill') | |||
print p #<__main__.Person instance at 0x7f1573d2d908> | |||
self指的是类实例对象本身(注意:不是类本身)。 | |||
class Person: | |||
def __init__(self,name): | |||
self.name=name | |||
def sayhello(self): | |||
print 'My name is:',self.name | |||
p=Person('Bill') | |||
print p #<__main__.Person instance at 0x7f1573d2d908> | |||
在上述例子中,self指向Person的实例p。 为什么不是指向类本身呢,如下例子: | |||
class Person: | |||
def __init__(self,name): | |||
self.name=name | |||
def sayhello(self): | |||
print 'My name is:',self.name | |||
p=Person('Bill') | |||
p1 = Person('Apple') | |||
print p | |||
如果self指向类本身,那么当有多个实例对象时,self指向哪一个呢? | |||
<pre> | |||
有self必是方法(method),而不是函数。其余的楼上说的都很对 | |||
http://www.pythoneye.com.cn/pythonshipin/%E8%BF%AA%E8%89%BE%E5%A7%86python%E5%9F%B9%E8%AE%AD_python%E5%9F%B9%E8%AE%AD_%E5%AE%9E%E4%BE%8B%E5%AF%B9%E8%B1%A1.flv | |||
self代表类的实例,而非类。 | |||
=参考资料= | |||
[https://blog.csdn.net/CLHugh/article/details/75000104 Python中self用法详解] | |||
[http://blog.csdn.net/bing900713/article/details/60884931 Python self参数 & 函数详解] | |||
[http://blog.csdn.net/shb_derek1/article/details/8475601 Python self 详解] | |||
[http://www.cnblogs.com/jessonluo/p/4717140.html 彻底搞清楚Python中self的含义] | |||
[https://sjolzy.cn/Why-should-self-Python.html Python为什么要self] | |||
[http://www.cnblogs.com/linuxcat/archive/2012/01/05/2220997.html 深入理解python之self] | |||
[[category:python]] | |||
2019年10月14日 (一) 13:52的最新版本
在Python中,定义类是通过class关键字,class后面紧接着是类名,类名通常是大写开头的单词,紧接着是('要继承的类名'),表示该类是从哪个类继承下来的,可以有多个父类(基类),通常如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类,也可以不写。
class F1(object):
def __init__(self,name,age):
self.name = name
self.age = age
f1 = F1('python',27)
这里注意:(1)、__init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
(2)、有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去
---------------------
上面的这个__init__()叫做初始化方法(或构造方法), 在类实例化时,这个方法(虽然它是函数形式,但在类中就不叫函数了,叫方法)会自动执行,
进行一些初始化的动作,所以我们这里写的__init__(self,name,age)就是要在创建一个角色时给它设置这些属性。
参数self有什么用呢?
1.在内存中开辟一块空间指向f1这个变量名 2.实例化F1这个类首先执行其中的__init__()方法,相当于F1.__init__(f1,'python',27),是为了把'python',27这2个值跟刚开辟的f1关联起来,因为关联起来后,你就可以直接f1.name, f1.age 这样来调用啦。所以,为实现这种关联,在调用__init__方法时,就必须把f1这个变量也传进去,否则__init__不知道要把那2个参数跟谁关联,self其实就是实例化对象f1被当作参数传递了。 3.所以这个__init__(…)构造方法里的,self.name = name , self.age = age 等等就是要把这几个值存到f1的内存空间里。
在Python中,类的方法与普通的函数有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。
虽然你可以给这个参数任何名称,但是强烈建议你使用self这个名称——其他名称都是不赞成你使用的。
使用一个标准的名称有很多优点——你的程序读者可以迅速识别它,如果使用self的话,还有些IDE(集成开发环境)也可以帮助你。
给C++/Java/C#程序员的注释Python中的self等价于C++中的self指针和Java、C#中的this参考。
#!/usr/bin/python
#-*- coding:utf-8 -*-
#创建实例类Test
class Test(object):
def add(self, a,b):
打印输出a +b 的值
print (a + b)
def display(self):
打印出字符串
print 'hello'
test = Test()
test.add(1,3) #调用方法
test.display()
def addTwo(a,b):
print (a + b)
addTwo(1,2)
4
hello
3
声明add()方法时,若不加self,则提示
Traceback (most recent call last):
File "selff.py", line 15, in <module>
test.add(1,3) #调用方法
TypeError: add() takes exactly 2 arguments (3 given)
总结: self
1.self在Python里不是关键字。self代表当前对象的地址。
2.跟java与C++中的this指针作用相似,但是区别在于:python的类方法的第一个参数都必须带self参数。
Python的类的方法和普通的函数有一个很明显的区别,在类的方法必须有个额外的第一个参数
(self),但在调用这个方法的时候不必为这个参数赋值(显胜于隐的引发)。Python的类的方法的这个特别的参数指代的是对象本身,而按照Python的惯例,它用self来表示。(当然我们也可以用其他任何名称来代替,只是规范和标准在那建议我们一致使用self)
为何Python给self赋值而你不必给self赋值?
例子说明:创建了一个类MyClass,实例化MyClass得到了MyObject这个对象,然后调用这个对象的方法MyObject.method(arg1,arg2)
,这个过程中,Python会自动转为Myclass.mehod(MyObject,arg1,arg2)
这就是Python的self的原理了。即使你的类的方法不需要任何参数,但还是得给这个方法定义一个self参数,虽然我们在实例化调用的时候不用理会这个参数不用给它赋值。
class Python:
def selfDemo(self):
print 'Python,why self?'
p = Python()
p.selfDemo()
把p.selfDemo()带个参数如:p.selfDemo(p),得到同样的输出结果
首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
self名称不是必须的,在python中self不是关键词,你可以定义成a或b或其它名字都可以,但是约定成俗,不要搞另类,大家会不明白的。下例中将self改为myname一样没有错误:
class Person:
def __init__(myname,name):
myname.name=name
def sayhello(myname):
print 'My name is:',myname.name
p=Person('Bill')
print p #<__main__.Person instance at 0x7f1573d2d908>
self指的是类实例对象本身(注意:不是类本身)。
class Person:
def __init__(self,name):
self.name=name
def sayhello(self):
print 'My name is:',self.name
p=Person('Bill')
print p #<__main__.Person instance at 0x7f1573d2d908>
在上述例子中,self指向Person的实例p。 为什么不是指向类本身呢,如下例子:
class Person:
def __init__(self,name):
self.name=name
def sayhello(self):
print 'My name is:',self.name
p=Person('Bill')
p1 = Person('Apple')
print p
如果self指向类本身,那么当有多个实例对象时,self指向哪一个呢?
有self必是方法(method),而不是函数。其余的楼上说的都很对
http://www.pythoneye.com.cn/pythonshipin/%E8%BF%AA%E8%89%BE%E5%A7%86python%E5%9F%B9%E8%AE%AD_python%E5%9F%B9%E8%AE%AD_%E5%AE%9E%E4%BE%8B%E5%AF%B9%E8%B1%A1.flv
self代表类的实例,而非类。
参考资料
Python中self用法详解
Python self参数 & 函数详解
Python self 详解
彻底搞清楚Python中self的含义
Python为什么要self
深入理解python之self