Latest web development tutorials

Python3 Object-Oriented

Python telah dirancang dari awal adalah bahasa berorientasi objek, dan dengan demikian, membuat kelas dan objek di python sangat mudah. bagian ini kita akan detail pemrograman berorientasi objek dengan Python.

Jika Anda belum terkena berorientasi objek bahasa pemrograman, maka Anda mungkin harus terlebih dahulu memahami beberapa fitur dasar bahasa berorientasi objek, terbentuk dalam pikiran dalam konsep dasar object-oriented, yang membantu Anda lebih mudah belajar Python pemrograman berorientasi obyek.

Selanjutnya, mari kita pemahaman sederhana berorientasi objek di bawah beberapa fitur dasar.


Berorientasi Objek Ikhtisar Teknologi

  • Kelas (kelas): digunakan untuk menggambarkan koleksi memiliki sifat dan metode objek yang sama. Ini mendefinisikan satu set properti dan metode umum untuk setiap objek. Objek adalah contoh kelas.
  • variabel kelas: variabel kelas umum di seluruh objek yang dipakai. variabel kelas didefinisikan dan luar fungsi di kelas di. variabel kelas biasanya tidak digunakan sebagai variabel instance.
  • data anggota: variabel kelas atau variabel misalnya untuk kelas pengolahan data yang terkait dan contoh objek.
  • Menggantikan: Jika Anda tidak dapat memenuhi kebutuhan subclass mewarisi dari metode kelas induk, dapat ditulis ulang, sebuah proses yang disebut metode overlay (override), juga dikenal sebagai metode utama.
  • Contoh variabel: variabel didefinisikan dalam metode, hanya peran kelas contoh saat.
  • Warisan: Itu adalah kelas turunan (kelas turunan) mewarisi kelas dasar (base class) bidang dan metode. Warisan juga memungkinkan sebuah objek kelas turunan sebagai objek memperlakukan kelas dasar. Sebagai contoh, ada desain seperti: jenis objek yang berasal dari kelas Dog Animal, yang merupakan analog "adalah (adalah-a)" hubungan (Gambar contoh, adalah Dog Animal).
  • Instantiate: membuat sebuah instance dari kelas, kelas objek tertentu.
  • Metode: Fungsi kelas-didefinisikan.
  • Obyek: Data struktur misalnya melalui definisi kelas. objek data termasuk dua anggota (kelas dan instance variabel) dan metode.

Dan bahasa pemrograman lain, Python minimal sintaks baru dan semantik situasi untuk bergabung mekanisme kelas.

kelas python dalam pemrograman berorientasi objek memberikan semua fungsi dasar: mekanisme warisan kelas memungkinkan beberapa kelas dasar, kelas dasar di kelas turunan dapat mengganti metode apapun, Anda dapat memanggil metode kelas dasar dengan nama yang sama.

Benda dapat berisi jumlah dan jenis data.

definisi kelas

Sintaks adalah sebagai berikut:

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

Setelah kelas diberi contoh, Anda dapat menggunakan sifat-sifatnya, pada kenyataannya, setelah Anda membuat kelas, Anda dapat mengakses propertinya melalui nama kelas.

objek kelas

objek kelas mendukung dua jenis operasi: referensi atribut dan Instansiasi.

Atribut referensi menggunakan Python untuk semua atribut referensisintaks standar: obj.name.

Setelah objek kelas diciptakan atribut kelas namespace semua nama adalah nama-nama yang valid. Jadi, jika definisi kelas tampak seperti ini:

#!/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())

Instantiate kelas:

# 实例化类
x = MyClass()
# 访问类的属性和方法

Di atas menciptakan contoh baru dari kelas dan memberikan objek ini ke variabel lokal x, x obyek kosong.

Output program di atas adalah:

MyClass 类的属性 i 为: 12345
MyClass 类的方法 f 输出为: hello world

Banyak kelas ingin membuat objek dalam keadaan awal dikenal. Oleh karena itu kelas dapat menentukan __init __ bernama () metode khusus (konstruktor), seperti ini:

def __init__(self):
    self.data = []

Kelas mendefinisikan __init __ () metode, maka operator kelas Instansiasi otomatis akan memanggil __init __ () metode. Jadi, dalam contoh ini, dapat untuk membuat contoh baru:

x = MyClass()

Tentu saja, __ () metode __init mungkin memiliki argumen, parameter __init __ () akan diteruskan ke operator kelas Instansiasi. Sebagai contoh:

>>> 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)

metode kelas

Dalam interior terestrial, penggunaan def kata kunci dapat didefinisikan sebagai metode kelas, definisi yang berbeda dan fungsi umum, metode kelas harus menyertakan parameter diri, dan sebagai parameter pertama:

#!/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()

Output program di atas adalah:

w3big 说: 我 10 岁。

mewarisi

Python juga mendukung warisan kelas, jika bahasa tidak mendukung warisan, kelas memiliki sedikit makna. Definisi kelas turunan sebagai berikut:

class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>

Perhatikan bahwa urutan kelas dasar dalam tanda kurung, jika kelas dasar memiliki nama metode yang sama, tetapi tanpa menentukan subclass, python dari kiri ke metode pencarian yang tepat yang tidak ditemukan di sub-kelas, dari kiri ke kanan untuk menemukan kelas dasar berisi metode.

BaseClassName (misalnya nama kelas dasar) harus didefinisikan dalam lingkup kelas turunan. Selain kelas, Anda dapat menggunakan ekspresi, kelas dasar didefinisikan dalam modul lain, yang sangat berguna untuk:

class DerivedClassName(modname.BaseClassName):

contoh

#!/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()

Output program di atas adalah:

ken 说: 我 10 岁了,我在读 3 年级

beberapa Warisan

Python mendukung bentuk terbatas dari beberapa warisan. definisi beberapa kelas warisan terlihat sebagai berikut:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

Perhatikan bahwa urutan kelas induk kurung, jika kelas induk memiliki nama metode yang sama, tetapi tanpa menentukan subclass, python dari kiri ke metode pencarian yang tepat yang tidak ditemukan di sub-kelas, dari kiri ke kanan untuk menemukan kelas induk berisi metode.

#!/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()   #方法名同,默认调用的是在括号中排前地父类的方法

Output program di atas adalah:

我叫 Tim,我是一个演说家,我演讲的主题是 Python

metode menimpa

Jika fungsi Anda adalah metode kelas induk tidak dapat memenuhi kebutuhan Anda, Anda dapat menulis ulang metode kelas induk di subclass, contoh adalah sebagai berikut:

#!/usr/bin/python3

class Parent:        # 定义父类
   def myMethod(self):
      print ('调用父类方法')

class Child(Parent): # 定义子类
   def myMethod(self):
      print ('调用子类方法')

c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法

Output program di atas adalah:

调用子类方法

atribut kelas dan metode

kelas milik pribadi

__private_attrs: mulai dua garis bawah yang menyatakan bahwa properti pribadi dan tidak dapat digunakan atau diakses langsung di kelas eksternal. Diri .__ private_attrs bila digunakan dalam metode kelas.

metode kelas

Dalam interior terestrial, penggunaan def kata kunci dapat didefinisikan sebagai metode kelas dengan definisi umum dari fungsi yang berbeda, metode kelas harus menyertakan parameter diri, dan sebagai parameter pertama

metode pribadi kelas

__private_method: dua garis bawah pertama, metode ini dinyatakan sebagai metode swasta di kelas tidak bisa memanggil eksternal. Internal panggilan kelas slef .__ private_methods.

contoh

Misalnya milik pribadi dari kelas sebagai berikut:

#!/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)  # 报错,实例不能访问私有变量

Output program di atas adalah:

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'

Metode swasta instance dari kelas sebagai berikut:

#!/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()      # 报错

Hasil contoh di atas:

metode milik kelas:

  • __init__: konstruktor dipanggil ketika sebuah objek yang dihasilkan
  • __del__: destructor, obyek rilis
  • __repr__: printing, konversi
  • __setitem__: sesuai penugasan indeks
  • __getitem__: Mendapat nilai indeks
  • __len__: mendapatkan panjang
  • __cmp__: operasi perbandingan
  • __call__: fungsi panggilan
  • __add__: menambahkan operasi
  • __sub__: pengurangan
  • __mul__: perkalian
  • __div__: operasi pembagian
  • __mod__: operator sisanya
  • __pow__: dipanggil pihak

Overloading Operator

Python juga mendukung operator overloading, apa yang saya dapat kelebihan beban metode kepemilikan kelas, contoh adalah sebagai berikut:

#!/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)

Hasil eksekusi kode di atas adalah sebagai berikut:

Vector(7,8)