Python入門系列(七)開發常說的「累」與「物件」

2022-09-01 12:04:40

類與物件

Python是一種物件導向的程式語言。

要建立類,請使用關鍵字class

class MyClass:
  x = 5

建立一個名為p1的物件,並列印x的值

p1 = MyClass()
print(p1.x)

所有類都有一個名為__init_()的函數,該函數總是在初始化類時執行。

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

p1 = Person("John", 36)

print(p1.name)
print(p1.age)

物件也可以包含方法。物件中的方法是屬於物件的函數。

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

  def myfunc(self):
    print("Hello my name is " + self.name)

p1 = Person("John", 36)
p1.myfunc()

self引數是對類的當前範例的參照,用於存取屬於該類的變數。
它不必命名為self,您可以隨意呼叫它,但它必須是類中任何函數的第一個引數:

# Use the words mysillyobject and abc instead of self
class Person:
  def __init__(mysillyobject, name, age):
    mysillyobject.name = name
    mysillyobject.age = age

  def myfunc(abc):
    print("Hello my name is " + abc.name)

p1 = Person("John", 36)
p1.myfunc()

您可以修改以下物件的屬性

p1.age = 40

可以使用del關鍵字刪除物件上的屬性

del p1.age

可以使用del關鍵字刪除物件

del p1

Python繼承

建立父類別

class Person:
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname

  def printname(self):
    print(self.firstname, self.lastname)

#Use the Person class to create an object, and then execute the printname method:

x = Person("John", "Doe")
x.printname()

建立子類

class Student(Person):
  pass

使用Student類建立物件,然後執行printname方法

x = Student("Mike", "Olsen")
x.printname()

新增__init_()函數時,子類將不再繼承父類別的_ init_()函數。

class Student(Person):
  def __init__(self, fname, lname):
    #add properties etc.

要保留父函數的__init_()函數的繼承,請新增對父函數的呼叫

class Student(Person):
  def __init__(self, fname, lname):
    Person.__init__(self, fname, lname)

Python還有一個super()函數,它將使子類繼承其父類別的所有方法和屬性

class Student(Person):
  def __init__(self, fname, lname):
    super().__init__(fname, lname)

通過使用super()函數,您不必使用父元素的名稱,它將自動從其父元素繼承方法和屬性。

新增屬性

class Person:
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname

  def printname(self):
    print(self.firstname, self.lastname)

class Student(Person):
  def __init__(self, fname, lname, year):
    super().__init__(fname, lname)
    self.graduationyear = year

x = Student("Mike", "Olsen", 2019)
print(x.graduationyear)

新增方法

class Student(Person):
  def __init__(self, fname, lname, year):
    super().__init__(fname, lname)
    self.graduationyear = year

  def welcome(self):
    print("Welcome", self.firstname, self.lastname, "to the class of", self.graduationyear)

Python迭代器

列表、元組、字典和集合都是可迭代物件。它們是可迭代的容器,您可以從中獲取迭代器。

mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)

print(next(myit))
print(next(myit))
print(next(myit))

建立迭代器

__iter__()方法的作用類似,您可以執行操作(初始化等),但必須始終返回迭代器物件本身。
__next_()方法還允許您執行操作,並且必須返回序列中的下一項。
class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self

  def __next__(self):
    x = self.a
    self.a += 1
    return x

myclass = MyNumbers()
myiter = iter(myclass)

print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

為了防止迭代永遠持續下去,我們可以使用StopIteration語句。

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self

  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration

myclass = MyNumbers()
myiter = iter(myclass)

for x in myiter:
  print(x)

作用域

如以上範例所述,變數x在函數外部不可用,但在函數內部的任何函數中都可用

def myfunc():
  x = 300
  def myinnerfunc():
    print(x)
  myinnerfunc()

myfunc()

如果需要建立全域性變數,但仍停留在區域性範圍內,則可以使用global關鍵字。

Python模組

要建立模組,只需將所需程式碼儲存在副檔名為.py的檔案中

# Save this code in a file named mymodule.py
def greeting(name):
  print("Hello, " + name)

現在,我們可以使用剛才建立的模組,方法是使用import語句

import mymodule

mymodule.greeting("Jonathan")

模組中的變數

# Save this code in the file mymodule.py
person1 = {
  "name": "John",
  "age": 36,
  "country": "Norway"
}
import mymodule

a = mymodule.person1["age"]
print(a)

匯入模組時,可以使用as關鍵字建立別名

import mymodule as mx

a = mx.person1["age"]
print(a)

有一個dir()函數來列出模組中的所有函數名(或變數名)

import platform

x = dir(platform)
print(x)

通過使用from關鍵字,您可以選擇僅從模組匯入零件。

def greeting(name):
  print("Hello, " + name)

person1 = {
  "name": "John",
  "age": 36,
  "country": "Norway"
}
from mymodule import person1

print (person1["age"])

您的關注,是我的無限動力!

公眾號 @生活處處有BUG