Python obiektowy
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.
Obiektowe Przegląd technologii
- (Klasa) stosowane do opisu kolekcji mają takie same właściwości i metody obiektów. To definiuje zestaw właściwości i metod wspólnych dla każdego obiektu. Obiekty są instancjami klas.
- Zmienne Klasa: zmienne klasy jest powszechne na całym instancja obiektu. Zmienne klasy zdefiniowane i na zewnątrz funkcji w klasie w. Zmienne klasy nie zwykle używane jako zmienne instancji.
- Członkowie danych: zmienne klasy lub zmiennych instancji dla klas związanych z przetwarzaniem danych i instancji obiektów.
- Zastępuje: Jeśli nie można zaspokoić potrzeby podklasa dziedziczy metody klasy nadrzędnej, to może być zapisane, a proces zwany metodą nakładki (override), znany również jako metoda nadrzędnego.
- Przykłady zmiennych: zmienne zdefiniowane w metodzie, tylko rola klasy bieżącej instancji.
- Dziedziczenie: To jest klasa pochodna (klasa pochodna) dziedziczy klasa podstawowa (klasy bazowej) pól i metod. Dziedziczenie umożliwia także pochodnej klasy jako obiekt klasy bazowej obiektu leczeniu. Na przykład, taka konstrukcja: typ obiektu, który pochodzi z klasy psów zwierzęcia, które jest analogiem "oznacza (is-a)" związek (przykład fig, jest pies zwierząt).
- Wystąpienia: utworzyć instancję klasy, konkretnej klasy obiektów.
- Metody: Funkcje klasy zdefiniowane.
- Object: Dane struktury przykład poprzez definicji klasy. Obiekty danych obejmują dwa elementy (class i wystąpień zmiennych) i metod.
Tworzenie klasy
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.
Przykłady
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
- Zmienna empCount jest zmienną klasy, jego wartość zostanie podzielone pomiędzy wszystkich wystąpień tej klasy. Można użyć dostępu Employee.empCount obrębie klasy lub klasy zewnętrznej.
- Metoda pierwsza metoda __init __ () jest metodą specjalną metodę, konstruktor, lub inicjalizacji klasy jest wywoływana podczas tworzenia instancji tej klasy będzie wywołać metodę
Utwórz instancję obiektu
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)
Właściwości dostępu
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:
- getattr (obj, nazwa [domyślnie]): obiekty dostępu własności.
- hasattr (obj, nazwa): Sprawdź, czy nie jest atrybutem.
- setattr (obj, nazwa, wartość): ustawić właściwość. Jeżeli nieruchomość nie istnieje, utwórz nową właściwość.
- delattr (obj, nazwa): usuwanie atrybutów.
hasattr(emp1, 'age') # 如果存在 'age' 属性返回 True。 getattr(emp1, 'age') # 返回 'age' 属性的值 setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8 delattr(empl, 'age') # 删除属性 'age'
Python atrybutem klasy wbudowanych
- __dict__: atrybuty klasy (w tym słowniku, przypisują dane skład klasy)
- __doc__: Klasa ciąg dokumentu
- __name__: nazwa klasy
- __module__: Moduł gdzie definicja klasy (pełna nazwa ". __main __ className", jeśli klasa znajduje się w importowanego modułu MyMod, potem className .__ module__ równa MyMod)
- __bases__: Wszystkie klasy elementu nadrzędnego (zawierające klasę nadrzędną zawierającą wszystkie krotki)
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>}
Obiekt python jest zniszczona (garbage collection)
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.
Przykłady
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,
Klasa dziedziczenie
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): // ... pisząc nazwę klasy bazowej w nawiasach, gdy klasa bazowa jest definicja klasy, między określonymi krotki.
W Pythonie dziedziczenia niektórych cech:
- 1: W następującej konfiguracji (metoda __init __ ()) Klasa Cheng Zhongji nie zostanie automatycznie wywoływana, to wymaga specjalistycznej osobiście nazywany w konstruktorze klasy pochodnej jej.
- 2: Podczas wywoływania metody klasy bazowej, trzeba dodać przedrostek nazwy klasy do klasy podstawowej i potrzebę doprowadzenia zmiennych parametrów siebie. Nie trzeba przynieść własny parametr różni się od zwykłego wywołania funkcji w klasie
- 3: Python zawsze najpierw znaleźć odpowiedni rodzaj podejścia, jeśli nie może znaleźć odpowiednią metodę w klasie pochodnej, zaczął szukać pojedynczo do klasy bazowej. (Pierwsza metoda wymaga, aby znaleźć się w tej klasie, aby znaleźć się znaleźć klasę bazową).
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, ...]): '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 ..... class B: # 定义类 B ..... class C(A, B): # 继承类 A 和 B .....
Można użyć issubclass () lub metodę isinstance () w celu wykrycia.
- issubclass () - funkcja logiczna celu ustalenia, czy dana klasa jest podklasą innej klasy lub potomka składni klasy: issubclass (sub, sup)
- isinstance (obj, Class) Funkcja logiczna, jeśli obj jest instancją klasy obiektu lub instancji obiektu klasy klasa jest podklasą zwraca true.
metoda nadpisania
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:
调用子类方法
Fundacja przeciążone metody
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 ...] ) 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) |
operator Przeciążenie
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)
atrybuty i metody klasy
Prywatna klasa własności
__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.
metody klas
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
Metody prywatnych klasy
__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
Przykłady
#!/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:
......................... print counter._JustCounter__secretCount
Wykonać powyższy kod, wyniki wykonania są następujące:
1 2 2 2