赞
踩
Python中self用法详解_CLHugh的博客-CSDN博客_python中self用法详解这篇博客讲的很好
summary:两点用处
定义了一个学生类,类包含了两个非静态方法(带有self),和一个静态方法(不带有self)
- class Student():
- def __init__(self, name, score):
- self.name = name
- self.score = score
- def age(self):
- print("my age is 10")
- return 10
-
- # 静态方法不需要传入self,调用时也不需要实例化,直接类名.方法名()即可
- @staticmethod
- def high():
- print("my high is 100")
- return 100
'运行
# 带有self的函数需要实例化才能调用
- student = Student(name="zhangsan", score=100)
- print(student.age())
# 不带self的函数可以直接调用
print(Student.high())
1.就是相当于java的this
2.由于类起到模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法__init__
方法,例如在Student类时,把name、score等属性绑上去:
- class Student(object):
- def __init__(self, name, score):
- self.name = name
- self.score = score
'运行
>>>student = Student("Hugh", 99)
>>>student.name
"Hugh"
>>>student.score
99
另外,这里self就是指类本身,self.name就是Student类的属性变量,是Student类所有。而name是外部传来的参数,不是Student类所自带的。故,self.name = name的意思就是把外部传来的参数name的值赋值给Student类自己的属性变量self.name。
这里注意:
(1)、__init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
(2)、有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去:
5、既然Student类实例本身就拥有这些数据,那么要访问这些数据,就没必要从外面的函数去访问,而可以直接在Student类的内部定义访问数据的函数(方法),这样,就可以把”数据”封装起来。这些封装数据的函数是和Student类本身是关联起来的,称之为类的方法:
- class Student(obiect):
- def __init__(self, name, score):
- self.name = name
- self.score = score
- def print_score(self):
- print "%s: %s" % (self.name, self.score)
-
-
- >>>student = Student("Hugh", 99)
- >>>student.print_score
- Hugh: 99
这样一来,我们从外部看Student类,就只需要知道,创建实例需要给出name和score。而如何打印,都是在Student类的内部定义的,这些数据和逻辑被封装起来了,调用很容易,但却不知道内部实现的细节。
__xxx_ 为私有变量
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线(这里是函数内部属性无法直接访问了,但是函数什么的还是可以正常调用),
3.在Python中,变量名类似__xxx__
的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__
、__score__
这样的变量名。
有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:
- class Student(object):
-
- def __init__(self, name, score):
- self.__name = name
- self.__score = score
- self.high = "12"
- def print_score(self):
- print("%s: %s" %(self.__name, self.__score))
-
- def print_high(self):
- print(self.high)
-
- student = Student(name='Hugh356', score=99)
-
-
- # 类里面的方法照样可以访问
- student.print_score()
- student.print_high()
-
- # 类里面的不带有__的参数可以直接访问,但是带有__的参数无法直接访问
- print(student.high)
- print(student.__name)
改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name
和实例变量.__score
了:
- Hugh356: 99
- 12
- 12
- Traceback (most recent call last):
- File "D:/pycharm_workspace/test/pytorch_study/basics/1self.py", line 22, in <module>
- print(student.__name)
- AttributeError: 'Student' object has no attribute '__name'
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。