Python3 obiektowe
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.
I innych języków programowania, Python przynajmniej nowej składni i semantyki sytuacji przystąpić do mechanizmu klasy.
Klasy Python w programowaniu obiektowym zapewnia wszystkie podstawowe funkcje: mechanizm klasy dziedziczenie pozwala wielu klas bazowych, klasa bazowa w klasach pochodnych może zastąpić wszelkie metody, można wywołać metodę klasy bazowej o tej samej nazwie.
Przedmioty mogą zawierać dowolną liczbę i typ danych.
definicja klasy
Składnia jest następująca:
class ClassName: <statement-1> . . . <statement-N>
Po klasy jest tworzony, można wykorzystać jego właściwości, w rzeczywistości, po utworzeniu klasy, można uzyskać dostęp do jego właściwości poprzez nazwę klasy.
obiekt Class
obiekty klasy obsługują dwa rodzaje operacji: Referencje atrybutów i instancji.
Atrybut odniesienia używać Pythona dla wszystkich atrybutu odwołuje się do standardowejskładni: obj.name.
Gdy obiekt klasy został stworzony atrybut namespace klasy wszystkie nazwy są prawidłowe nazwy. Tak więc, jeśli definicja klasy wyglądał następująco:
#!/usr/bin/python3 class MyClass: """一个简单的类实例""" i = 12345 def f(self): return 'hello world' # 实例化类 x = MyClass() # 访问类的属性和方法 print("MyClass 类的属性 i 为:", x.i) print("MyClass 类的方法 f 输出为:", x.f())
Instancję klasy:
# 实例化类 x = MyClass() # 访问类的属性和方法
Przede tworzy nową instancję klasy i przypisuje ten obiekt do lokalnej zmiennej x, x pusty obiekt.
Powyższy program jest wyjście:
MyClass 类的属性 i 为: 12345 MyClass 类的方法 f 输出为: hello world
Wiele klas lubią tworzyć obiekty w znanego stanu początkowego. Dlatego klasa może określić nazwie __init __ () specjalna metoda (konstruktor), na przykład:
def __init__(self): self.data = []
Klasa definiuje metody __init __ (), a następnie operator klasy instancji automatycznie wywoła metodę __init __ (). Tak więc w tym przykładzie, może być, aby utworzyć nową instancję:
x = MyClass()
Oczywiście metoda __init __ () może mieć argumenty, parametry __init __ () jest przekazywana do operatora klasy konkretyzacji. Na przykład:
>>> class Complex: ... def __init__(self, realpart, imagpart): ... self.r = realpart ... self.i = imagpart ... >>> x = Complex(3.0, -4.5) >>> x.r, x.i (3.0, -4.5)
metody klas
We wnętrzu naziemnej, używanie słów kluczowych def może być zdefiniowana jako metoda klasy, różnych definicji i najważniejszych funkcji, metody klasy musi zawierać parametr siebie, a jako pierwszy parametr:
#!/usr/bin/python3 #类定义 class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age)) # 实例化类 p = people('w3big',10,30) p.speak()
Powyższy program jest wyjście:
w3big 说: 我 10 岁。
dziedziczyć
Python obsługuje także klasy dziedziczenie, jeśli język nie obsługuje dziedziczenie, klasy ma niewielki sens. Definicja klasy pochodnej, co następuje:
class DerivedClassName(BaseClassName1): <statement-1> . . . <statement-N>
Zauważ, że kolejność w klasie bazowej w nawiasach, jeśli klasa bazowa ma taką samą nazwę metody, ale bez określania podklasy, Python od lewej do prawej metody wyszukiwania, która nie znajduje się w sub-klasy, od lewej do prawej, aby wybrać Klasa bazowa zawiera metody.
BaseClassName (przykład nazwa klasy bazowej) musi być zdefiniowana w klasie pochodnej zakresu. Oprócz zajęć, można użyć wyrażenia, klasa bazowa jest określona w innym module, który jest bardzo przydatny dla:
class DerivedClassName(modname.BaseClassName):
Przykłady
#!/usr/bin/python3 #类定义 class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age)) #单继承示例 class student(people): grade = '' def __init__(self,n,a,w,g): #调用父类的构函 people.__init__(self,n,a,w) self.grade = g #覆写父类的方法 def speak(self): print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade)) s = student('ken',10,60,3) s.speak()
Powyższy program jest wyjście:
ken 说: 我 10 岁了,我在读 3 年级
Wielokrotne dziedziczenie
Python obsługuje ograniczoną formę wielokrotnego dziedziczenia. Definicja Wielokrotne dziedziczenie klasy wygląda następująco:
class DerivedClassName(Base1, Base2, Base3): <statement-1> . . . <statement-N>
Zauważ, że kolejność w nawiasach klasy nadrzędnej, jeśli klasa dominująca mają taką samą nazwę metody, ale bez określania podklasy, Python od lewej do prawej metody wyszukiwania, która nie znajduje się w sub-klasy, od lewej do prawej, aby wybrać klasa dominująca zawiera metody.
#!/usr/bin/python3 #类定义 class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age)) #单继承示例 class student(people): grade = '' def __init__(self,n,a,w,g): #调用父类的构函 people.__init__(self,n,a,w) self.grade = g #覆写父类的方法 def speak(self): print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade)) #另一个类,多重继承之前的准备 class speaker(): topic = '' name = '' def __init__(self,n,t): self.name = n self.topic = t def speak(self): print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic)) #多重继承 class sample(speaker,student): a ='' def __init__(self,n,a,w,g,t): student.__init__(self,n,a,w,g) speaker.__init__(self,n,t) test = sample("Tim",25,80,4,"Python") test.speak() #方法名同,默认调用的是在括号中排前地父类的方法
Powyższy program jest wyjście:
我叫 Tim,我是一个演说家,我演讲的主题是 Python
metoda nadpisania
Jeśli funkcja jesteś metoda klasy rodzic nie może zaspokoić swoich potrzeb, można przepisać swoją macierzystą metody klasy w podklasie, przykłady przedstawiają się następująco:
#!/usr/bin/python3 class Parent: # 定义父类 def myMethod(self): print ('调用父类方法') class Child(Parent): # 定义子类 def myMethod(self): print ('调用子类方法') c = Child() # 子类实例 c.myMethod() # 子类调用重写方法
Powyższy program jest wyjście:
调用子类方法
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. Wewnętrzne SLEF wywołanie klasy .__ private_methods.
Przykłady
Prywatna własność instancja klasy, co następuje:
#!/usr/bin/python3 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) # 报错,实例不能访问私有变量
Powyższy program jest wyjście:
1 2 2 Traceback (most recent call last): File "test.py", line 16, in <module> print (counter.__secretCount) # 报错,实例不能访问私有变量 AttributeError: 'JustCounter' object has no attribute '__secretCount'
Metoda prywatna instancja klasy, co następuje:
#!/usr/bin/python3 class Site: def __init__(self, name, url): self.name = name # public self.__url = url # private def who(self): print('name : ', self.name) print('url : ', self.__url) def __foo(self): # 私有方法 print('这是私有方法') def foo(self): # 公共方法 print('这是公共方法') self.__foo() x = Site('本教程', 'www.w3big.com') x.who() # 正常输出 x.foo() # 正常输出 x.__foo() # 报错
Wyniki z powyższych przykładów:
Własne metody klasy:
- __init__: konstruktor jest wywoływana, gdy obiekt jest generowany
- __del__: destructor, obiekty uwalnianiu
- __repr__: drukowanie, konwersja
- __setitem__: zgodnie z przypisaniem indeksu
- __getitem__: Pobiera wartość indeksu
- __len__: uzyskać długość
- __cmp__: operacja porównania
- __call__: wywołanie funkcji
- __add__: dodawanie operacji
- __sub__: odejmowanie
- __mul__: mnożenie
- __div__: Operacja podziału
- __mod__: Operator pozostała
- __pow__: abonent
operator Przeciążenie
Python obsługuje także przeciążanie operatorów, co mogę być przeciążone klasy metody praw własności, przykłady przedstawiają się następująco:
#!/usr/bin/python3 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)