Latest web development tutorials

Python3 เชิงวัตถุ

งูใหญ่ได้รับการออกแบบตั้งแต่เริ่มต้นเป็นภาษาเชิงวัตถุและเป็นเช่นนี้สร้างคลาสและวัตถุในหลามเป็นเรื่องง่ายมาก ส่วนนี้เราจะมีรายละเอียดการเขียนโปรแกรมเชิงวัตถุในหลาม

หากคุณไม่ได้รับการสัมผัสกับวัตถุที่มุ่งเน้นการเขียนโปรแกรมภาษาแล้วคุณอาจจะต้องเข้าใจก่อนบางส่วนของคุณสมบัติพื้นฐานของภาษาเชิงวัตถุที่เกิดขึ้นในใจภายในแนวคิดพื้นฐานของวัตถุซึ่งจะช่วยให้คุณได้ง่ายขึ้นเรียนรู้หลาม การเขียนโปรแกรมเชิงวัตถุ

ถัดไปให้ใช้ความเข้าใจที่ง่ายของเชิงวัตถุภายใต้คุณสมบัติพื้นฐานบางอย่าง


ภาพรวมเทคโนโลยีเชิงวัตถุ

  • คลาส (Class): ใช้เพื่ออธิบายคอลเลกชันที่มีคุณสมบัติและวิธีของวัตถุ มันกำหนดชุดของคุณสมบัติและวิธีการที่พบบ่อยในแต่ละวัตถุ วัตถุกรณีของการเรียน
  • ตัวแปรระดับ: ตัวแปรระดับเป็นเรื่องธรรมดาทั่ววัตถุ instantiated ตัวแปรระดับที่กำหนดไว้และภายนอกฟังก์ชั่นในชั้นเรียนใน ตัวแปรระดับปกติไม่ได้ใช้เป็นตัวแปรเช่น
  • ข้อมูลสมาชิก: ตัวแปรระดับหรือตัวแปรเช่นสำหรับการเชื่อมโยงการเรียนการประมวลผลข้อมูลและวัตถุเช่น
  • การแทนที่: ถ้าคุณไม่สามารถตอบสนองความต้องการของ subclass สืบทอดมาจากวิธีการเรียนผู้ปกครองก็สามารถเขียนเป็นกระบวนการที่เรียกว่าวิธีการซ้อนทับ (แทนที่) ยังเป็นที่รู้จักวิธีการเอาชนะ
  • ตัวอย่างของตัวแปร: ตัวแปรที่กำหนดไว้ในวิธีการเฉพาะบทบาทของชั้นเรียนของอินสแตนซ์ปัจจุบัน
  • มรดก: นั่นคือคลาสที่ได้รับ (ชั้นมา) สืบทอดชั้นฐาน (ชั้นฐาน) เขตข้อมูลและวิธีการ มรดกยังช่วยให้วัตถุชั้นมาเป็นวัตถุรักษาชั้นฐาน ตัวอย่างเช่นมีเช่นการออกแบบ: ประเภทของวัตถุที่ได้รับมาจากชั้นสุนัขสัตว์ซึ่งเป็นอะนาล็อก "เป็น (เป็น-A)" ความสัมพันธ์ (รูปตัวอย่างเช่นเป็นสัตว์สุนัข)
  • อินสแตนซ์: สร้างตัวอย่างของชั้นที่ชั้นวัตถุที่เฉพาะเจาะจง
  • วิธีการ: ฟังก์ชั่นระดับที่กำหนดไว้
  • เช่นโครงสร้างข้อมูลผ่านการกำหนดชั้น: วัตถุ วัตถุข้อมูลรวมถึงสองสมาชิก (ชั้นและอินสแตนซ์ตัวแปร) และวิธีการ

และการเขียนโปรแกรมภาษาอื่น ๆ , งูหลามที่ต่ำสุดของไวยากรณ์ใหม่และความหมายของสถานการณ์ที่จะเข้าร่วมกลไกชั้นเรียน

เรียนหลามในการเขียนโปรแกรมเชิงวัตถุให้ทุกฟังก์ชั่นพื้นฐานกลไกระดับมรดกช่วยให้ฐานเรียนหลายชั้นฐานในชั้นเรียนมาสามารถแทนที่วิธีการใด ๆ ที่คุณสามารถเรียกวิธีการเรียนฐานที่มีชื่อเดียวกัน

วัตถุที่สามารถมีจำนวนและชนิดของข้อมูล

การกำหนดระดับ

ไวยากรณ์เป็นดังนี้:

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

หลังเลิกเรียนจะยกตัวอย่างคุณสามารถใช้คุณสมบัติของมันในความเป็นจริงหลังจากที่คุณสร้างชั้นที่คุณสามารถเข้าถึงคุณสมบัติผ่านชื่อชั้น

วัตถุชั้น

วัตถุชั้นสนับสนุนสองชนิดของการดำเนินงาน: การอ้างอิงและแอตทริบิวต์ instantiation

แอตทริบิวต์การอ้างอิงใช้งูหลามสำหรับแอตทริบิวต์ทั้งหมดอ้างอิงไวยากรณ์มาตรฐาน: obj.name

หลังจากวัตถุชั้นที่ถูกสร้างขึ้นแอตทริบิวต์ระดับ namespace ชื่อทั้งหมดเป็นชื่อที่ถูกต้อง ดังนั้นถ้าการกำหนดชั้นมองเช่นนี้

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

อินสแตนซ์คลาส:

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

ดังกล่าวข้างต้นจะสร้างตัวอย่างใหม่ของชั้นเรียนและกำหนดวัตถุนี้ตัวแปร x ท้องถิ่น x วัตถุที่ว่างเปล่า

เอาท์พุทโปรแกรมข้างต้นเป็น:

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

ชั้นเรียนหลายคนต้องการที่จะสร้างวัตถุในสถานะเริ่มต้นเป็นที่รู้จักกัน ดังนั้นระดับอาจกำหนด __ ชื่อ __init () วิธีพิเศษ (คอนสตรัค) เช่นนี้

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

ระดับกำหนด __init __ () วิธีการแล้วผู้ประกอบการระดับ instantiation จะเรียก __init __ () วิธีการโดยอัตโนมัติ ดังนั้นในตัวอย่างนี้ก็สามารถที่จะสร้างตัวอย่างใหม่:

x = MyClass()

แน่นอน __init __ () วิธีการอาจจะมีข้อโต้แย้งพารามิเตอร์ __init __ () จะถูกส่งผ่านไปยังผู้ประกอบการระดับ instantiation ตัวอย่างเช่น:

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

วิธีการเรียน

ในการตกแต่งภายในบกคำหลักที่ใช้ def สามารถกำหนดเป็นวิธีการเรียนคำนิยามที่แตกต่างกันและการทำงานโดยทั่วไปวิธีการเรียนต้องมีพารามิเตอร์ตัวเองและเป็นพารามิเตอร์แรก:

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

เอาท์พุทโปรแกรมข้างต้นเป็น:

w3big 说: 我 10 岁。

สืบทอด

งูใหญ่ยังสนับสนุนมรดกระดับหากภาษาไม่สนับสนุนการสืบทอดชั้นมีความหมายเล็ก ๆ น้อย ๆ ความหมายของการเรียนมาดังต่อไปนี้:

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

โปรดทราบว่าคำสั่งของชั้นฐานในวงเล็บถ้าชั้นฐานมีชื่อวิธีเดียวกัน แต่ไม่มีการระบุ subclasses หลามจากซ้ายไปขวาวิธีการค้นหาที่ไม่พบในชั้นย่อยจากซ้ายไปขวาเพื่อหา ชั้นฐานประกอบด้วยวิธีการ

BaseClassName (เช่นชื่อชั้นฐาน) จะต้องกำหนดไว้ในขอบเขตที่เรียนมา นอกเหนือจากการเรียนคุณสามารถใช้การแสดงออกชั้นฐานที่กำหนดไว้ในโมดูลอื่นซึ่งมีประโยชน์มากสำหรับ:

class DerivedClassName(modname.BaseClassName):

ตัวอย่าง

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

เอาท์พุทโปรแกรมข้างต้นเป็น:

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

มรดกหลาย

งูหลามสนับสนุน จำกัด รูปแบบของมรดกหลาย นิยามมรดกหลายชั้นมีลักษณะดังต่อไปนี้:

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

โปรดทราบว่าการสั่งซื้อในระดับผู้ปกครองวงเล็บถ้าระดับผู้ปกครองมีชื่อวิธีเดียวกัน แต่ไม่มีการระบุ subclasses หลามจากซ้ายไปขวาวิธีการค้นหาที่ไม่พบในชั้นย่อยจากซ้ายไปขวาเพื่อหา ระดับผู้ปกครองมีวิธีการ

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

เอาท์พุทโปรแกรมข้างต้นเป็น:

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

วิธีการแทนที่

หากฟังก์ชั่นที่คุณมีวิธีการเรียนผู้ปกครองไม่สามารถตอบสนองความต้องการของคุณคุณสามารถเขียนวิธีการเรียนผู้ปกครองของคุณในประเภทรองตัวอย่างดังต่อไปนี้:

#!/usr/bin/python3

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

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

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

เอาท์พุทโปรแกรมข้างต้นเป็น:

调用子类方法

แอตทริบิวต์การเรียนและวิธีการ

ระดับทรัพย์สินส่วนตัว

__private_attrs: จุดเริ่มต้นที่สองขีดระบุว่าทรัพย์สินที่มีความเป็นส่วนตัวและไม่สามารถนำมาใช้หรือเข้าถึงได้โดยตรงในชั้นเรียนภายนอก ตนเอง .__ private_attrs เมื่อใช้ในวิธีการเรียน

วิธีการเรียน

ในการตกแต่งภายในบกคำหลักที่ใช้ def สามารถกำหนดเป็นวิธีการเรียนที่มีความหมายทั่วไปของฟังก์ชั่นที่แตกต่างกันวิธีการเรียนต้องมีพารามิเตอร์ตัวเองและเป็นพารามิเตอร์แรก

วิธีการส่วนตัวของชั้น

__private_method: สองขีดแรกวิธีการที่ถูกประกาศเป็นวิธีเอกชนในชั้นเรียนไม่สามารถเรียกภายนอก ภายใน slef เรียกคลาส .__ private_methods

ตัวอย่าง

เช่นทรัพย์สินส่วนตัวของชั้นดังต่อไปนี้:

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

เอาท์พุทโปรแกรมข้างต้นเป็น:

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'

เช่นวิธีการส่วนตัวของชั้นดังต่อไปนี้:

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

ผลที่ได้จากตัวอย่างข้างต้น:

วิธีการที่เป็นกรรมสิทธิ์ของชั้นเรียน:

  • __init__: คอนสตรัคจะถูกเรียกเมื่อวัตถุถูกสร้างขึ้น
  • __del__: destructor วัตถุปล่อย
  • __repr__: การพิมพ์, การแปลง
  • __setitem__: ตามที่ได้รับมอบหมายดัชนี
  • __getitem__: ได้รับความคุ้มค่าในดัชนี
  • __len__: ได้รับความยาว
  • __cmp__: การดำเนินการเปรียบเทียบ
  • __call__: ฟังก์ชั่นการโทร
  • ใช้ __add__ เพิ่มการดำเนินงาน
  • __sub__: ลบ
  • __mul__: คูณ
  • __div__: การดำเนินการส่วน
  • __mod__: ผู้ประกอบการที่เหลือ
  • __pow__: บุคคลที่เรียกว่า

ดำเนินงานมาก

งูใหญ่ยังสนับสนุนการดำเนินงานมากสิ่งที่ฉันสามารถจะมากเกินไปวิธีการที่เป็นกรรมสิทธิ์ของชั้นตัวอย่างดังต่อไปนี้:

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

ผลการดำเนินโค้ดข้างต้นมีดังนี้

Vector(7,8)