Dieser Artikel ist der dritte. Es gibt insgesamt vier Artikel, die den Grundstein für Python legen. Die beiden oben genannten haben im Wesentlichen die Datenstruktur in Python gelöst.
7. Objektorientierte Programmierung
Objekte können Variablen der Klasse verwenden, die als Felder bezeichnet werden. Objekte können auch als Methoden der Klasse bezeichnet werden Klasse.
Es gibt zwei Arten von Feldern
die zu Instanzen gehörenKlassen werden mit dem Schlüsselwort class
erstellt und die Felder und Methoden der Klasse werden in einem eingerückten Block aufgelistet.
Die Methode der Klasse muss einen zusätzlichen ersten Parameter haben, aber diesem Parameter wird beim Aufruf kein Wert zugewiesen. Diese spezielle Variable bezieht sich konventionell auf das Objekt selbst, ähnlich wie in Java. class
创建,类的域和方法被列在一个缩进块中。
类的方法必须有一个额外的第一个参数,但是在调用时不为这个参数赋值,这个特殊变量指对象本身,按照惯例它的名称是self,类似Java中的this。
在类中下面两个特都方法需要注意:
__init__
方法:在类的一个对象被创建时调用该方法;相当于c++中的构造函数,就是当这个类调用了,那么这个__init__ 方法就要执行。
__del__
方法:在类的对象被销毁时调用该方法;相当于c++中的析构函数。在使用del删除一个对象时也就调用__del__方法,__del__是最后调用的。
Python中所有的类成员(包括数据成员)都是public的,没有Java的私有类,也就是人人都有调用类,虽然编写变成很简单, 但是资源人人都可以随意分配访问,在项目中确实一个不好的东西。
但是Python 类的却有私有变量和私有方法之说,这个是一个例外,如果使用的数据成员以双下划线为前缀,则为私有变量。
你实例化这个类,访问不了。这是很多人忽略 的
比如:
class public(): _name = 'protected类型的变量' __info = '私有类型的变量' def _f(self): print("这是一个protected类型的方法") def __f2(self): print('这是一个私有类型的方法') def get(self): return(self.__info) pub = public()# 先打印可以访问的print(pub._name) pub._f()####结果如下####protected类型的变量 这是一个protected类型的方法# 打印下类 私有变量和私有方法print(pub.__info) 报错:'public' object has no attribute '__info'pub._f2() 报错:pub._f2()复制代码
但是私有属性和方法可以在同一个类中被调用
pub.get()#######'私有类型的变量'复制代码
上面是很多人不知道的,下面,我来声明一个Person类
class Person(): Count = 0 def __init__(self, name, age): Person.Count += 1 self.name = name self.__age = age p = Person("Runsen", 20) print(p.Count)# 1 说明我实例化,这个__init__方法就要执行print(p.name) #Runsenprint (p.__age) #AttributeError: Person instance has no attribute '__age'#私有变量访问不了,报错复制代码
面向对象编程 (OOP),英语全称:Object Oriented Programming,面向对象编程的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
继承,其实这样理解,就是我写了一个爸爸类和儿子类,爸爸有钱,儿子却没钱,于是儿子决定继承爸爸,调用爸爸的钱(爸爸类的变量和方法)。
继承一个类,基本使用下面的五个方法。
爸爸有钱,儿子却没钱,于是儿子用爸爸的钱
class Father(): def __init__(self): self.money= 1000 def action(self): print('调用父类的方法') class Son(Father): pass son=Son() # 子类Son 继承父类Father的所有属性和方法son.action() # 调用父类属性输出:调用父类的方法 son.money # 调用父类属性输出:1000复制代码
爸爸说,你这个儿子,老是用我的钱,我决定藏私房钱。儿子试试super()
拿你的私房钱,但是这里需要注意super()
强制调用父类私有属性方法,就是重写方法,私有变量是不能用supper继承不了,还不可以访问父类中的私有属性方法的变量,就是儿子是拿不了私房钱的。
class Father(): __money = 1000 #私有变量是继承不了 def __action(self): # 父类的私有方法 money = 1000 print('调用父类的方法') class Son(Father): def action(self): super()._Father__action() print(money) son=Son() son.action() 调用父类的方法 name 'money' is not defined复制代码
突然间儿子竟然有钱,决定不用爸爸的钱,用自己的钱,决定重写父类属性方法。
class Father(): def __init__(self): self.money = 0 def action(self): print('调用父类的方法') class Son(Father): def __init__(self): self.money = 1000 def action(self): print('子类重写父类的方法') son=Son() # 子类Son继承父类Father的所有属性和方法son.action() # 子类Son调用自身的action方法而不是父类的action方法son.money # 自己的1000复制代码
如果爸爸把钱放在__init__
__init__
-Methode: Diese Methode wird aufgerufen, wenn ein Objekt der Klasse erstellt wird; sie entspricht dem Konstruktor in C++, das heißt, wenn diese Klasse aufgerufen wird, wird die Methode __init__ ausgeführt.
__del__
-Methode: Diese Methode wird aufgerufen, wenn das Objekt der Klasse zerstört wird; das entspricht dem Destruktor in C++. Wenn Sie del zum Löschen eines Objekts verwenden, wird auch die Methode __del__ aufgerufen, und __del__ ist die letzte, die aufgerufen wird.
Alle Klassenmitglieder (einschließlich Datenmitglieder) in Java sind öffentlich. Es gibt keine privaten Klassen, das heißt, jeder hat eine aufrufende Klasse.
Aber Ressourcen können von jedem nach Belieben zugewiesen und abgerufen werden, was in dem Projekt tatsächlich eine schlechte Sache ist. Python-Klassen verfügen jedoch über private Variablen und private Methoden. Dies ist eine Ausnahme. Wenn dem verwendeten Datenelement ein doppelter Unterstrich vorangestellt ist, handelt es sich um eine private Variable. Wenn Sie diese Klasse instanziieren, kann nicht auf sie zugegriffen werden. Das ignorieren viele LeuteZum Beispiel:🎜class Father(): def __init__(self): self.money = 1000 class Son(Father): def __init__(self): pass son=Son() print(son.money)# 报错:'Son' object has no attribute 'money'复制代码
class Father(): def __init__(self): self.money = 1000 class Son(Father): def __init__(self): super().__init__() #也可以用 Father.__init__(self) 这里面的self一定要加上(上面两个相同) son=Son() print(son.money) 1000复制代码
class Father(): def __init__(self): self.earn_money=1000 self.spend_money= -500 class Son(Father): def __init__(self): super().__init__() #也可以用 Father.__init__(self) 这里面的self一定要加上 def add(self): return self.earn_money+self.spend_money son=Son() print(son.add())500复制代码
class Father(): def __init__(self,a,b): self.earn_money = a self.spend_money= b def add(self): return self.a + self.b #调用父类初始化参数a,b并增加额外参数cclass Son(Father): def __init__(self,a,b,c=1000): # c固定值 Father.__init__(self,a,b) self.son_money = c def add(self): return self.earn_money+self.spend_money + self.son_money son=Son(1000,-500) # 所以c可以不用显示表达出来print(son.add()) # 调用子类add函数1500复制代码
super()
, um Ihr privates Geld zu erhalten, aber hier müssen Sie beachten, dass super()
einen Aufruf der privaten Attributmethode der übergeordneten Klasse erzwingt, bei der es sich um eine handelt Überschriebene Methoden können nicht mit supper erbt werden, und Sie können nicht auf die Variablen der privaten Attributmethoden in der übergeordneten Klasse zugreifen. Das heißt, der Sohn kann kein privates Geld erhalten. 🎜In [1]: input()1Out[1]: '1'复制代码
test = '''\ This is a program about file I/O. Author: Runsen Date: 2020/3/31 '''f = open("test.txt", "w") f.write(test) f.close() f = open("test.txt") #默认rwhile True: line = f.readline() if len(line) == 0: break print(line) f.close()######This is a program about file I/O. Author: Runsen Date: 2020/3/31复制代码
__init__
einzahlt, ist es für den Sohn möglich, das Geld zu bekommen? Das Geld des Vaters? Es handelt sich nicht um private Variablen, also ist es kein privates Geld. Natürlich können Sie es bekommen. Mal sehen, ob wir es bekommen können, ohne Super zu verwenden. 🎜import pickle datafile = "data.data"mylist = ["Runsen", "is", "20"] f = open("test.txt", "wb+") pickle.dump(mylist, f) f.close()del mylist f = open(datafile,'rb+') mylist = pickle.load(f) print(mylist)#["Runsen", "is", "20"]复制代码
try: print (1/0)except ZeropisionError as e: print(e)except: print( "error or exception occurred.")#integer pision or modulo by zero复制代码
In [1]: input()1Out[1]: '1'复制代码
可以使用file类打开一个文件,使用file的read、readline和write来恰当的读写文件。对文件读写能力取决于打开文件时使用的模式, 常用模式
文件操作之后需要调用close方法来关闭文件。如果用with open就不用slose了。
还有r+,w+,a+
但r+与w+不同的是,不会把原先存在txt中的东西清空,下面是他们的对比,反正尽量用a+,基本没什么错报出来。
描述 | r+ | w+ | a+ |
---|---|---|---|
当前文件不存在时文件 | 抛出异常 | 创建文件 | 创建文件 |
打开后原文件内容 | 保留 | 清空 | 保留 |
初始位置 | 0 | 0 | 文件尾 |
写入位置 | 标记位置 | 标记位置 | 写入时默认跳至文件尾 |
补充个例子吧:
test = '''\ This is a program about file I/O. Author: Runsen Date: 2020/3/31 '''f = open("test.txt", "w") f.write(test) f.close() f = open("test.txt") #默认rwhile True: line = f.readline() if len(line) == 0: break print(line) f.close()######This is a program about file I/O. Author: Runsen Date: 2020/3/31复制代码
存储器,大家应该不知道。python提供一个标准的模块,成为pickle,使用它可以在一个文件中存储任何python对象,之后可以完整的取出来,这被称为持久地存储对象;还有另外一个模块成为cPickle,它的功能和pickle完全一样,只不过它是用c写的,要比pickle速度快(大约快1000倍)。
import pickle datafile = "data.data"mylist = ["Runsen", "is", "20"] f = open("test.txt", "wb+") pickle.dump(mylist, f) f.close()del mylist f = open(datafile,'rb+') mylist = pickle.load(f) print(mylist)#["Runsen", "is", "20"]复制代码
当程序中出现某些异常的状况时,异常就发生了。
python中可以使用try ... except
处理。
try: print (1/0)except ZeropisionError as e: print(e)except: print( "error or exception occurred.")#integer pision or modulo by zero复制代码
相关免费学习推荐:python视频教程
Das obige ist der detaillierte Inhalt vonDer dritte Python-Wissenspunkt, zusammengestellt für Anfänger. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!