当前位置:   article > 正文

Python中self用法详解_python self.

python self.

Python中self用法详解_CLHugh的博客-CSDN博客_python中self用法详解这篇博客讲的很好

summary:两点用处

  1. 在类的__init__方法使用self初始化参数,以方便该类的其他方法直接调用被初始化的参数而不需要从外面调用
  2. 实例化该类后,可以直接调用该实例中的self参数

调用实例:

定义了一个学生类,类包含了两个非静态方法(带有self),和一个静态方法(不带有self)

  1. class Student():
  2. def __init__(self, name, score):
  3. self.name = name
  4. self.score = score
  5. def age(self):
  6. print("my age is 10")
  7. return 10
  8. # 静态方法不需要传入self,调用时也不需要实例化,直接类名.方法名()即可
  9. @staticmethod
  10. def high():
  11. print("my high is 100")
  12. return 100
'
运行

# 带有self的函数需要实例化才能调用

  1. student = Student(name="zhangsan", score=100)
  2. print(student.age())

# 不带self的函数可以直接调用

print(Student.high())


1.就是相当于java的this

2.由于类起到模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法__init__方法,例如在Student类时,把name、score等属性绑上去:

  1. class Student(object):
  2. def __init__(self, name, score):
  3. self.name = name
  4. 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类本身是关联起来的,称之为类的方法:

  1. class Student(obiect):
  2. def __init__(self, name, score):
  3. self.name = name
  4. self.score = score
  5. def print_score(self):
  6. print "%s: %s" % (self.name, self.score)
  7. >>>student = Student("Hugh", 99)
  8. >>>student.print_score
  9. Hugh: 99

这样一来,我们从外部看Student类,就只需要知道,创建实例需要给出name和score。而如何打印,都是在Student类的内部定义的,这些数据和逻辑被封装起来了,调用很容易,但却不知道内部实现的细节。

变量名类似__xxx_ 为私有变量

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线(这里是函数内部属性无法直接访问了,但是函数什么的还是可以正常调用

3.在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name____score__这样的变量名。

有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:

  1. class Student(object):
  2. def __init__(self, name, score):
  3. self.__name = name
  4. self.__score = score
  5. self.high = "12"
  6. def print_score(self):
  7. print("%s: %s" %(self.__name, self.__score))
  8. def print_high(self):
  9. print(self.high)
  10. student = Student(name='Hugh356', score=99)
  11. # 类里面的方法照样可以访问
  12. student.print_score()
  13. student.print_high()
  14. # 类里面的不带有__的参数可以直接访问,但是带有__的参数无法直接访问
  15. print(student.high)
  16. print(student.__name)

改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:

  1. Hugh356: 99
  2. 12
  3. 12
  4. Traceback (most recent call last):
  5. File "D:/pycharm_workspace/test/pytorch_study/basics/1self.py", line 22, in <module>
  6. print(student.__name)
  7. AttributeError: 'Student' object has no attribute '__name'

Python中self用法详解_CLHugh的博客-CSDN博客_python self

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/883414
推荐阅读
相关标签
  

闽ICP备14008679号