python基础能做什么,python基础教程是什么意思
序
我就不说OOP的概念了。我想我很了解它。
Oop的三个特点:继承性、封装性和多态性。Python作为一门动态语言,不仅实现了静态语言这三大特性的常规功能,还扩展了许多面向对象的新特性。
新型班级
在python以前的版本中,Python还是用的老类,现在基本上是新类了。两者在写作上的差异
类别Myclass:
类Myclass(对象):
新类直接或间接继承自object的基类。如果没有可以明显继承的父类,那么在括号中添加object,声明它是一个新类。与旧类相比,新类最大的变化是当父类搜索本类中不存在的属性时,将深度优先搜索从以前的深度优先搜索改为广度优先搜索。这种变化的原因也与新类的类继承的层次关系有关。对于A类(B,C),如果仍然使用广度优先搜索,会从B递归搜索到对象基类,这样在继承更多的类时,每次都会重复访问对象基类,降低了效率。
新类还首次增加了一些旧类没有的新属性,比如_ _ slots _ _ _ setattr _ _ _ class _ _等等。
密封和包装
这里需要结合上一篇文章python- Namespace和Scope来解释类对象的有效原理。
定义一个类时,会在当前的局部范围内创建一个命名空间,即类名到类对象的映射,类中的属性要用类名的前缀来引用。
对于类中定义的变量,是类变量和实例变量之间的差异。一个类对所有实例都是可见的,而单个实例中的变量只对它自己可见。
类Myclass(对象):
a=1
def __init__(self,b):
self.b=b
A=我的类(2)
B=Myclass(3)
第一条
学士学位#1
A.a=100
文学士#100
A.b #2
B.b #3
类中定义的函数和实例化对象中使用的函数都称为方法。方法和普通函数的区别在于方法的第一个参数是self。例如,这种方法的本质是将实例化的A对象和方法参数组装成一个新的参数列表来调用类中的函数a.f (a.f(param)。
__word__声明的属性是特殊的变量或方法。正常情况下,我们不需要它。上面例子中__init__的函数是在类实例化时初始化实例的一个特殊方法,相当于c中的构造函数,实际中经常使用这个方法向实例化传递参数。
看看下面的类:
班级学生(对象):
测试类
kind=school
def __init__(自己,姓名,年龄):
self.name=name
年龄=年龄
定义输出(自身):
打印(自己的名字)
打印(自我年龄)
定义年龄(自己,年龄):
年龄=年龄
艾伦=学生(艾伦, 22 )
彼得=学生(彼得, 23 )
打印(Allen.kind)
打印(Peter.kind)
打印(Allen.name,Allen.age)
打印(彼得.姓名,彼得.年龄)
对于class Student,实例化了两个对象Allen和Peter,它们分别具有name age属性和common kind属性。封装的好处是不需要关心类外具体方法的实现,而是可以抽象操作方法并提供。例如,上例中的output方法也可以通过setage重置实例对象的age属性。
当然c中有私有变量和公共变量的区分,目的是为了保护一些重要的变量不被随意或无意的修改。Python在这方面也提供了访问限制。
在class属性之前,添加一个下划线_来声明该变量是私有变量。如果您看到class属性带下划线,正确的做法是不要使用它。但这都要靠自觉!加载其他模块时,不会加载带有_ declaration的变量和方法。Python并没有真正隐藏属性,它依靠这些常规规则来避免麻烦。
当继承关系很深时,命名新类的属性可能会很头疼。因为你要考虑到新的命名会覆盖父类中哪个你不知道的属性。这种情况下可以在属性前加一个双下划线_ _ python解释器会把这样的变量解析成_classname__word,这样不同类名的前缀就避免了覆盖父类属性的麻烦。例如,在上面的示例中,当所有的self.name都更改为self时。_ _名称,并通过Allen访问。_ _ names,将会报告一个错误,因为解释器已经更改了变量名。当然,在类内部,可以添加getage()方法来访问。类中属性的命名仍然可以通过self访问。_ _名称。(虽然可以通过Allen强制访问name属性。_ Allen _ _课外名,不推荐!风险自担)
继承
继承很简单。在类Myclass()的括号中,只需添加需要继承的类。与java中的单一继承不同,python允许多重继承!也就是说,A类(B,C)继承了B类和C类.当然,这里有一个问题。当调用一个不在类A中的属性时,应该寻找哪个父类呢?你可以专门阅读这篇文章,直接看例子:
A类:
def __init__(self):
及格
定义保存(自己):
打印(“这是来自A”)
B(A)类:
def __init__(self):
及格
丙类(甲类):
def __init__(self):
及格
定义保存(自己):
打印(“这是来自C”)
D类(B、C类):
def __init__(self):
及格
fun=D()
fun.save()
一个很简单的例子,如果来自A,就是深度优先搜索,如果来自C,就是广度优先搜索。当然,覆盖父类的现有方法会覆盖原来的实现,通过上面提到的双下划线命名机制可以避免冲突。子类可以通过super()调用父类中的方法。
可以通过isinstance(object,class)判断一个对象是否是一个类的实例。还可以通过issubclass(class1,class2)判断class1是否是class2的子类。
多态的
python中的多态功能非常强大,它支持duck类型。先看有继承关系的类中的多态性:
类人类(对象):
def out(自身):
印刷品(“我生活在地球上”)
亚洲人(人类):
def out(自身):
印刷品(“我住在亚洲”)
中文类(亚洲):
def out(自身):
印刷品(“我住在中国”)
定义运行(人):
person.out()
A=人类()
B=亚洲人()
C=中文()
运行(A)
运行(B)
运行(C)
结果:
我生活在地球上
我住在亚洲
我住在中国
只定义了一个函数run(person),但是可以调用三个类中的方法。这就是多态的魅力。不要在意传入对象的具体信息,只要实现了out方法,就可以调用。当然,只要你的父类中有实现,就可以调用有继承关系的类。
对于静态语言来说,函数是在定义的时候定义的,所以多态的威力仅限于只有继承关系的类。Python这种动态语言,只要你定义的对象有out()方法就可以调用,甚至不需要你是函数定义参数的子类。例如在上面例子中添加的。
动物类(对象):
def out(自身):
打印(“我不是人。”)
输出
我生活在地球上
我住在亚洲
我住在中国
我不是人。
Animals并不是Humen的子类,只是因为它实现了out()方法,所以可以被run()函数调用。这就是著名的鸭式。在动态语言中,不需要严格的继承。只要这个物体长得像鸭子,走路像鸭子,就当它是鸭子!
接触过网络编程的同学应该很容易想到网络编程中有相关的实现。比如读写一个文件,你会调用这些方法open() read() write()来操作文件,但是有很多特殊的文件是可以通过这三个API来调用的,比如socket描述符,pipe管道等等。这些东西和文件一样长,所以可以被这些API调用!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。