玖富娱乐平台全网唯一指定1956注册开户网站

Python从菜鸟到妙手(18):类与要领的私有化_玖

日期:2019-01-10 浏览:
玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

1. 建立自身的类

进修面向工具的第一步,就是建立一个类。因为类是面向工具的基石。Python类和其他编程言语(Java、C#等)的类差不多,也须要运用class关键字。下面经由过程一个现实的例子来看一下Python类是怎样建立的。

本例会建立一个类,和应用这个类建立两个工具,并挪用个中的要领。

 1 # 建立一个Person类
 2 class Person:
 3     # 界说setName要领
 4     def setName(self, name):
 5         self.name = name
 6     # 界说getName要领
 7     def getName(self):
 8         return self.name
 9     # 界说greet要领
10     def greet(self):
11         print("Hello, I'm {name}.".format(name = self.name))
12 
13 # 建立Person工具
14 person1 = Person()
15 # 建立Person工具
16 person2 = Person()
17 # 挪用person1工具的setName要领
18 person1.setName("Bill Gates")
19 # 挪用person2工具的name属性
20 person2.name = "Bill Clinton"
21 # 挪用person1工具的getName要领
22 print(person1.getName())
23 # 挪用person1工具的greet要领
24 person1.greet()
25 # 挪用person2工具的属性
26 print(person2.name)
27 # 挪用person2工具的greet要领,别的一种挪用要领的体式格局
28 Person.greet(person2)

 

顺序运转结果以下图所示。

从上面的代码我们能够相识到Python类的以下知识点。

  • Python类运用class关键字界说,类名直接跟在class关键字的背面。
  • 类也是一个代码块,以是类名背面要随着一个冒号(:)。
  • 类中的要领实在就是函数,界说的要领也完整一样,只是因为函数界说在类的内部,以是为了辨别,将界说在类内部的函数称为要领。
  • 我们能够看到,每个要领的第1个参数都是self,实在这是必需的。这个参数名不一定叫self(能够叫abc或任何其他名字),但恣意一个要领必需最少指定一个self参数,若是要领中包罗多个参数,第1个参数将作为self参数运用。在挪用要领时,这个参数的值不须要自身通报,体系会将要领所属的工具传入这个参数。在要领内部能够应用这个参数挪用工具自身的资本,如属性、要领等。
  • 经由过程self参数增加的name变量是Person类的属性,能够在外部接见。本例设置了person2工具的name属性的值,与挪用person2.setName要领的结果完整雷同。
  • 运用类建立工具的体式格局与挪用函数的体式格局雷同。在Python言语中,不须要像Java一样运用new关键字建立工具,只须要用类名加上组织要领(在背面的章节会细致引见)参数值便可。
  • 挪用工具的要领有两种体式格局,一种是直接经由过程工具变量挪用要领,另一种是经由过程类挪用要领,而且将响应的工具传入要领的第1个参数。在本例中运用了Person.greet(person2)的体式格局挪用了person2工具中的greet要领。

若是运用集成开辟情况,如PyDev、PyCharm,那末代码编辑器也会对面向工具有很好的支撑,比方,当在工具变量后输入一个点(.)后,IDE会为我们列出该工具中一切能够挪用的资本,包孕要领和属性,以下图所示。

2.要领和私有化

Python类默许情况下,一切的要领都能够被外部接见。不外像许多其他编程言语,如Java、C#等,都供应了private关键字将要领私有化,也就是说只要类的内部要领能力接见私有化的要领,经由过程一般的体式格局是无法接见工具的私有化要领的(除非运用反射手艺,这就另当别论了)。不外在Python类中并没有供应private或相似的关键字将要领私有化,但能够曲线救国。

在Python类的要领名前面加双下划线(__)能够让该要领在外部弗成接见。

 1 class Person:
 2     # method1要领在类的外部能够接见
 3     def method1(self):
 4         print("method1")
 5     # __method2要领在类的外部弗成接见
 6     def __method2(self):
 7         print("method2")
 8 
 9 p = Person()
10 p.method1()
11 p.__method2()       # 抛出非常

 

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-

若是实行上面的代码,会抛出以下图所示的非常信息,缘由是挪用了私有化要领method2。

实在“method2”要领也不是相对弗成接见。Python编译器在编译Python源代码时并没有将“method2”要领真正私有化,而是一旦碰到要领名以双下划线(__)开首的要领,就会将要领名改成“ClassNamemethodName”的情势。个中ClassName透露表现该要领地点的类名,“methodName”透露表现要领名。ClassName前面要加上但单下划线()前缀。

关于上面的代码,Python编译器会将“method2”要领更名为“_Personmethod2”,以是在类的外部挪用“method2”要领会抛出非常。抛出非常的缘由并非“method2”要领被私有化了,而是Python编译器把“method2”的称号改成“_Personmethod2”了。当我们相识了这些背地的道理,就能够经由过程挪用“_Personmethod2”要领来实行“method2”要领。

1 p = Person()
2 p._Person__method2()        # 一般挪用“__method2”要领

 

本例会建立一个MyClass类,并界说两个大众的要领(getName和setName)和一个私有的要领(outName)。然后建立了MyClass类的实例,并挪用了这些要领。为了证实Python编译器在编译MyClass类时做了四肢,本例还运用了inspect模块中的getmembers函数猎取MyClass类中一切的成员要领,并输出要领名。很显然,“outName”被改成了“_MyClass__outName”。

 1 class MyClass:
 2     # 大众要领
 3     def getName(self):
 4         return self.name
 5     # 大众要领
 6     def setName(self, name):
 7         self.name = name
 8         # 在类的内部能够直接挪用私有要领
 9         self.__outName()
10     # 私有要领    
11     def __outName(self):
12         print("Name = {}".format(self.name))        
13 
14 myClass = MyClass()
15 # 导入inspect模块
16 import inspect
17 # 猎取MyClass类中一切的要领
18 methods = inspect.getmembers(myClass, predicate=inspect.ismethod)
19 print(methods)
20 # 输出类要领的称号
21 for method in methods:
22     print(method[0])
23 print("------------")
24 # 挪用setName要领
25 myClass.setName("Bill")
26 # 挪用getName要领
27 print(myClass.getName())
28 # 挪用“__outName”要领,这里挪用了改完名后的要领,以是能够一般实行
29 myClass._MyClass__outName()
30 # 抛出非常,因为“__outName”要领在MyClass类中其实不存在
31 print(myClass.__outName())

 

顺序运转结果以下图所示。

从getmembers函数列出的MyClass类要领的名字能够看出,“_MyClassoutName”被绑定到了“outName”要领上,我们能够将“_MyClassoutName”看作是“outName”的一个别号,一旦为某个要领起了别号,那末本来的名字在类外部就弗成用了。MyClass类中的getName要领和setName要领的别号和原始要领名雷同,以是在外部能够直接挪用getName和setName要领。

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。


平台新闻

联系方式丨CONTACT

  • 全国热线:7711177
  • 传真热线:010-88888888
  • Q Q咨询:7711177
  • 企业邮箱:
首页
电话
短信