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)