Najlepszy samouczek Python obiektowy W 2024 r. W tym samouczku możesz dowiedzieć się Obiektowe Przegląd technologii,Tworzenie klasy,Utwórz instancję obiektu,Właściwości dostępu,Python atrybutem klasy wbudowanych,Obiekt python jest zniszczona (garbage collection),Klasa dziedziczenie,metoda nadpisania,Fundacja przeciążone metody,operator Przeciążenie,atrybuty i metody klasy,
Python został zaprojektowany od samego początku jest językiem zorientowanym obiektowo, i jako takie, utworzyć klasy i obiekty w Pythonie jest bardzo proste. W tej sekcji będziemy szczegółowo programowania obiektowego w języku Python.
Jeśli nie zostały narażone na obiektowego języka programowania, to być może trzeba najpierw zrozumieć kilka podstawowych cech języków obiektowych, powstałych w umyśle wewnątrz podstawowej koncepcji obiektowego, co pozwala łatwiej nauczyć się Pythona programowania zorientowanego obiektowo.
Następnie weźmy prosty zrozumienia obiektowego w pewnych podstawowych funkcji.
Użyj oświadczenie klasy, aby utworzyć nową klasę, po zajęciach, a nazwa klasy kończy się dwukropkiem, następujące przykłady:
class ClassName: '类的帮助信息' #类文档字符串 class_suite #类体
Klasa Pomoc może być postrzegana przez ClassName .__ doc__.
class_suite złożona z członków klasy, metody, dane atrybutów.
Poniżej znajduje się prosty instancji klasy Pythona:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary
Aby utworzyć instancję klasy, można użyć nazwy klasy i zaakceptować metodę parameters __init__.
"创建 Employee 类的第一个对象" emp1 = Employee("Zara", 2000) "创建 Employee 类的第二个对象" emp2 = Employee("Manni", 5000)
Możesz użyć kropki (.) obiekt, aby uzyskać dostęp do obiektu. Dostęp do zmiennej klasy z nazwą klasy w następujący sposób:
emp1.displayEmployee() emp2.displayEmployee() print "Total Employee %d" % Employee.empCount
Kompletny przykład:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary "创建 Employee 类的第一个对象" emp1 = Employee("Zara", 2000) "创建 Employee 类的第二个对象" emp2 = Employee("Manni", 5000) emp1.displayEmployee() emp2.displayEmployee() print "Total Employee %d" % Employee.empCount
Wykonanie powyższego kodu wyniki wyjściowe są w następujący sposób:
Name : Zara ,Salary: 2000 Name : Manni ,Salary: 5000 Total Employee 2
Można dodawać, usuwać, modyfikować właściwości klasy, co następuje:
emp1.age = 7 # 添加一个 'age' 属性 emp1.age = 8 # 修改 'age' 属性 del emp1.age # 删除 'age' 属性
Można również uzyskać dostęp do właściwości korzystać z następujących funkcji:
hasattr(emp1, 'age') # 如果存在 'age' 属性返回 True。 getattr(emp1, 'age') # 返回 'age' 属性的值 setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8 delattr(empl, 'age') # 删除属性 'age'
Python wywoła wbudowany w przykładach atrybutów klasy są następujące:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary print "Employee.__doc__:", Employee.__doc__ print "Employee.__name__:", Employee.__name__ print "Employee.__module__:", Employee.__module__ print "Employee.__bases__:", Employee.__bases__ print "Employee.__dict__:", Employee.__dict__
Wykonanie powyższego kodu wyniki wyjściowe są w następujący sposób:
Employee.__doc__: 所有员工的基类 Employee.__name__: Employee Employee.__module__: __main__ Employee.__bases__: () Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0x10a939c80>, 'empCount': 0, 'displayEmployee': <function displayEmployee at 0x10a93caa0>, '__doc__': '\xe6\x89\x80\xe6\x9c\x89\xe5\x91\x98\xe5\xb7\xa5\xe7\x9a\x84\xe5\x9f\xba\xe7\xb1\xbb', '__init__': <function __init__ at 0x10a939578>}
Podobnie jak w języku Java, Python używa licznik odniesień Ta prosta technika śledzenia obiektów w pamięci.
W rekordzie wewnętrznego Python wszystkich obiektów wykorzystujących odpowiednie numery odniesień.Wewnętrzny zmienne śledzenia, zwany licznik odniesienia.
Gdy obiekt jest utworzony tworzy liczbę odniesienia, gdy przedmiot nie jest już potrzebny, to znaczy, odniesienie do liczby przedmiotów staje się 0, to jest zbierane śmieci. Ale odzyskanie nie jest "natychmiast" przez interpreter w odpowiednim czasie, obiekty śmieci zajmują przestrzeń pamięci rekultywacji.
a = 40 # 创建对象 <40> b = a # 增加引用, <40> 的计数 c = [b] # 增加引用. <40> 的计数 del a # 减少引用 <40> 的计数 b = 100 # 减少引用 <40> 的计数 c[0] = -1 # 减少引用 <40> 的计数
Mechanizm zbierania śmieci nie tylko do zliczania odniesienia przedmiot jest 0, to samo można również obsługiwać przypadek odniesień kołowych. Odnosi się do okrągłej odniesienia dwa przedmioty znajdują się siebie nawzajem, ale nie inne zmienne odniesienia im. W tym przypadku tylko licznik odwołań nie wystarczy. garbage collector Pythona jest rzeczywiście odniesienie do licznika cykli i śmieciarza. Jako dodatkowy element odniesienia liczenia garbage collector będzie zwracać uwagę na łączną kwotę przeznaczono duże obiekty (nie licząc tych zniszczonych przez odniesienie). W tym przypadku, interpreter zatrzyma się, próbując oczyścić cały cykl bez numeru referencyjnego.
Destructor __del__, __ del__ jest wywoływana, gdy obiekt zostanie zniszczony, gdy obiekt nie jest już używany, __ metodę del__ uruchomić:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Point: def __init__( self, x=0, y=0): self.x = x self.y = y def __del__(self): class_name = self.__class__.__name__ print class_name, "销毁" pt1 = Point() pt2 = pt1 pt3 = pt1 print id(pt1), id(pt2), id(pt3) # 打印对象的id del pt1 del pt2 del pt3
Przykłady powyższe wyniki przedstawiają się następująco:
3083401324 3083401324 3083401324 Point 销毁
Uwaga: Zazwyczaj trzeba zdefiniować klasę w oddzielnym pliku,
Jedną z głównych korzyści wynikających z programowania obiektowego doprowadza do ponownego użycia ponowne wykorzystanie kodu, aby osiągnąć jeden z nich jest za pomocą mechanizmu dziedziczenia. Dziedziczone całkowicie zrozumiałe typu i podtypu relacje między klasami do.
Zastrzeżenie: Dziedziczenie Składnia klasa pochodzi nazwa klasy (nazwa klasy bazowej): // pl. pisząc nazwę klasy bazowej w nawiasach, gdy klasa bazowa jest definicja klasy, między określonymi krotki.
W Pythonie dziedziczenia niektórych cech:
Jeśli kolumna więcej niż jedna klasa w krotce spadkowego, to nazywa się "wielokrotne dziedziczenie".
Składnia:
Deklaracja klasy pochodnej, podobnie jak ich klasy nadrzędnej, to dziedziczą klasy bazowej listy z nazwą klasy, w następujący sposób:
class SubClassName (ParentClass1[, ParentClass2, pl.]): 'Optional class documentation string' class_suite
Przykład:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Parent: # 定义父类 parentAttr = 100 def __init__(self): print "调用父类构造函数" def parentMethod(self): print '调用父类方法' def setAttr(self, attr): Parent.parentAttr = attr def getAttr(self): print "父类属性 :", Parent.parentAttr class Child(Parent): # 定义子类 def __init__(self): print "调用子类构造方法" def childMethod(self): print '调用子类方法 child method' c = Child() # 实例化子类 c.childMethod() # 调用子类的方法 c.parentMethod() # 调用父类方法 c.setAttr(200) # 再次调用父类的方法 c.getAttr() # 再次调用父类的方法
Powyższy kod jest wykonywany w następujący sposób:
调用子类构造方法 调用子类方法 child method 调用父类方法 父类属性 : 200
Można odziedziczyć wiele klas
class A: # 定义类 A plpl. class B: # 定义类 B plpl. class C(A, B): # 继承类 A 和 B plpl.
Można użyć issubclass () lub metodę isinstance () w celu wykrycia.
Jeśli funkcja jesteś metoda klasy rodzic nie może zaspokoić swoich potrzeb, można przepisać swoją nadrzędną klasy metody w podklasie:
Przykład:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Parent: # 定义父类 def myMethod(self): print '调用父类方法' class Child(Parent): # 定义子类 def myMethod(self): print '调用子类方法' c = Child() # 子类实例 c.myMethod() # 子类调用重写方法
Wykonanie powyższego kodu wyniki wyjściowe są w następujący sposób:
调用子类方法
W poniższej tabeli przedstawiono niektóre z typowych cech, które można przesłonić w swojej klasie:
Nie. | Metoda opisana po prostu zadzwonić i |
---|---|
1 | __init__ (self [, args pl.] ) Wystarczy zadzwonić dokonstruktora:obj = className (args) |
2 | __del __ (self) Destruktory, usunąć obiekt prosta metodapołączenia:dell OBJ |
3 | __repr __ (self) Przekształcenie formy dla tłumacza czytać prostą metodępołączenia:repr (obj) |
4 | __str __ (self) Dla wartości w postaci nadającej się do ludzkiego czytania prosta metodapołączenia:str (obj) |
5 | __cmp__ (self, x) Object metoda stosunkowo prostepołączenie:cmp (obj, x) |
Pyton obsługuje przeciążenie operatora przykłady są następujące:
#!/usr/bin/python class Vector: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return 'Vector (%d, %d)' % (self.a, self.b) def __add__(self,other): return Vector(self.a + other.a, self.b + other.b) v1 = Vector(2,10) v2 = Vector(5,-2) print v1 + v2
Wyniki wykonania, powyższy kod są następujące:
Vector(7,8)
__private_attrs: zaczynając dwa podkreślenia stwierdzające, że nieruchomość jest prywatny i nie mogą być używane lub dostępne bezpośrednio w klasie zewnętrznie. Self .__ private_attrs kiedy jest stosowany w metodzie klasy.
We wnętrzu naziemnej kluczowe zastosowanie def może być zdefiniowana jako metoda z klasy ogólnej definicji różnych funkcji, metody klasie musi zawierać siebie parametru, jak i pierwszy parametr
__private_method: pierwsze dwa podkreślenia, metoda jest zadeklarowana jako metody prywatne w klasie nie może dzwonić na zewnątrz. Wywoła self .__ private_methods w klasie
#!/usr/bin/python # -*- coding: UTF-8 -*- class JustCounter: __secretCount = 0 # 私有变量 publicCount = 0 # 公开变量 def count(self): self.__secretCount += 1 self.publicCount += 1 print self.__secretCount counter = JustCounter() counter.count() counter.count() print counter.publicCount print counter.__secretCount # 报错,实例不能访问私有变量
Python, zmieniając nazwę na zawierać nazwę klasy:
1 2 2 Traceback (most recent call last): File "test.py", line 17, in <module> print counter.__secretCount # 报错,实例不能访问私有变量 AttributeError: JustCounter instance has no attribute '__secretCount'
Python nie jest dozwolone Dostęp instancja klasy prywatne dane, ale można użyć atrybutów dostępu object._className__attrName poniższy kod zastąpi ostatnią linię kodu powyższego kodu:
plplplplplplplplplplplpl. print counter._JustCounter__secretCount
Wykonać powyższy kod, wyniki wykonania są następujące:
1 2 2 2