页面“Self 参数详解”与“Shell之提取文件名和目录名的一些方法”之间的差异

来自linux中国网wiki
(页面间的差异)
跳到导航 跳到搜索
(导入1个版本)
 
(导入1个版本)
 
第1行: 第1行:
  在Python中,定义类是通过class关键字,class后面紧接着是类名,类名通常是大写开头的单词,紧接着是('要继承的类名'),表示该类是从哪个类继承下来的,可以有多个父类(基类),通常如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类,也可以不写。
+
== 一、使用${} 变量替换扩展 ==
 +
===1、${var##*/} 提取出文件名===
 +
<pre>该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。使用例子及结果如下:
 +
evan@evanpc:~$ var=/data/test.txt
 +
evan@evanpc:~$ echo ${var##*/}
 +
test.txt
 +
从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。
 +
若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file=${var##*/}</pre>
  
<pre>
+
===2、${var##*.} 提取出文件名后缀===
class F1(object): 
+
<pre>该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果如下:
    def __init__(self,name,age): 
+
[root@bak hosts]# var=eg.conf
        self.name = name
+
[root@bak hosts]#echo ${var##*.}
        self.age = age
+
conf
   
+
从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。
f1 = F1('python',27)
+
如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。</pre>
  
这里注意:(1)、__init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
+
===3、${var#*.} 提取出文件名有多个点的后缀===
(2)、有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去
+
<pre>该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果如下:
---------------------
+
evan@evanpc:~$ var=/data/test.tar.bz2
 +
evan@evanpc:~$ echo ${var#*.}
 +
tar.bz2
 +
从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。</pre>
  
 +
=== 4、${var%/*} 提取文件所在的目录===
 +
<pre>该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果如下:
 +
evan@evanpc:~$ var=/data/test.tar.bz2
 +
evan@evanpc:~$ echo ${var%/*}
 +
/data </pre>
  
  </pre>
+
=== 5、${var%%.*}  ===
   
+
<pre>该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果如下:
上面的这个__init__()叫做初始化方法(或构造方法), 在类实例化时,这个方法(虽然它是函数形式,但在类中就不叫函数了,叫方法)会自动执行,<br>进行一些初始化的动作,所以我们这里写的__init__(self,name,age)就是要在创建一个角色时给它设置这些属性。
+
evan@evanpc:~$ var=/data/love/file.txt
参数self有什么用呢?
+
evan@evanpc:~$ echo ${var%%.*}
 +
/data/love/file
 +
当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。</pre>
  
1.在内存中开辟一块空间指向f1这个变量名
+
===6、${}总结===
2.实例化F1这个类首先执行其中的__init__()方法,相当于F1.__init__(f1,'python',27),是为了把'python',27这2个值跟刚开辟的f1关联起来,因为关联起来后,你就可以直接f1.name, f1.age 这样来调用啦。所以,为实现这种关联,在调用__init__方法时,就必须把f1这个变量也传进去,否则__init__不知道要把那2个参数跟谁关联,self其实就是实例化对象f1被当作参数传递了。
+
<pre>其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/''.'。也就是说,上面的使用方法只是它使用的一个特例。
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>
+
例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。
#!/usr/bin/python
 
#-*- coding:utf-8 -*-
 
#创建实例类Test
 
class Test(object):
 
  
    def add(self, a,b):
+
看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。</pre>
        '''打印输出a +b 的值 '''
 
        print (a + b)
 
  
    def display(self):
 
        ''' 打印出字符串'''
 
        print 'hello'
 
  
test = Test()
+
==二、basename和dirname==
test.add(1,3) #调用方法
+
${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。
test.display()
 
  
def addTwo(a,b):
 
    print (a + b)
 
  
addTwo(1,2)   
+
=== 1、basename ===
''' 
+
<pre>该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。
4
+
1)从路径中提出出文件名(带后缀),例子如下:
hello
+
evan@evanpc:~$ var=/data/love/file.txt
3
+
evan@evanpc:~$ echo $(basename $var)
'''
+
file.txt </pre>
  
声明add()方法时,若不加self,则提示
+
===2、dirname===
Traceback (most recent call last):
+
<pre>该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME
  File "selff.py", line 15, in <module>
+
使用例子如下:
    test.add(1,3) #调用方法
+
evan@evanpc:~$ var=/data/love/file.txt
TypeError: add() takes exactly 2 arguments (3 given)
+
evan@evanpc:~$ dirname $var
 +
/data/love
  
总结: self
+
注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:
1.self在Python里不是关键字。self代表当前对象的地址。
+
evan@evanpc:~$ var=/data/love/
2.跟java与C++中的this指针作用相似,但是区别在于:python的类方法的第一个参数都必须带self参数。
+
evan@evanpc:~$ dirname $var
 +
/data
  
 +
它提取出了目录love所在的目录date.</pre>
  
Python的类的方法和普通的函数有一个很明显的区别,在类的方法必须有个额外的第一个参数
 
(self),但在调用这个方法的时候不必为这个参数赋值(显胜于隐的引发)。Python的类的方法的这个特别的参数指代的是对象本身,而按照Python的惯例,它用self来表示。(当然我们也可以用其他任何名称来代替,只是规范和标准在那建议我们一致使用self)
 
  
为何Python给self赋值而你不必给self赋值?
 
  
例子说明:创建了一个类MyClass,实例化MyClass得到了MyObject这个对象,然后调用这个对象的方法MyObject.method(arg1,arg2)
+
http://blog.csdn.net/ljianhui/article/details/43128465
,这个过程中,Python会自动转为Myclass.mehod(MyObject,arg1,arg2)
 
  
这就是Python的self的原理了。即使你的类的方法不需要任何参数,但还是得给这个方法定义一个self参数,虽然我们在实例化调用的时候不用理会这个参数不用给它赋值。
 
  
class Python:
+
[[category:shell]]
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的最新版本

一、使用${} 变量替换扩展

1、${var##*/} 提取出文件名

该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。使用例子及结果如下:
evan@evanpc:~$ var=/data/test.txt
evan@evanpc:~$ echo ${var##*/}
test.txt
从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。
若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file=${var##*/}

2、${var##*.} 提取出文件名后缀

该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果如下:
[root@bak hosts]# var=eg.conf 
[root@bak hosts]#echo ${var##*.}
conf
从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。
如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。

3、${var#*.} 提取出文件名有多个点的后缀

该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果如下:
evan@evanpc:~$ var=/data/test.tar.bz2
evan@evanpc:~$ echo ${var#*.}
tar.bz2
从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。

4、${var%/*} 提取文件所在的目录

该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果如下:
evan@evanpc:~$ var=/data/test.tar.bz2
evan@evanpc:~$ echo ${var%/*}
/data 

5、${var%%.*}

该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果如下:
evan@evanpc:~$ var=/data/love/file.txt
evan@evanpc:~$ echo ${var%%.*}
/data/love/file
当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。

6、${}总结

其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。

看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。
#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
换句话来说,#总是表示左边算起,%总是表示右边算起。

*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。

例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。

看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。


二、basename和dirname

${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。


1、basename

该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。
1)从路径中提出出文件名(带后缀),例子如下:
evan@evanpc:~$ var=/data/love/file.txt
evan@evanpc:~$ echo $(basename $var)
file.txt 

2、dirname

该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME
使用例子如下:
evan@evanpc:~$ var=/data/love/file.txt
evan@evanpc:~$ dirname $var
/data/love

注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:
evan@evanpc:~$ var=/data/love/
evan@evanpc:~$ dirname $var
/data

它提取出了目录love所在的目录date.


http://blog.csdn.net/ljianhui/article/details/43128465