จะหลีกเลี่ยง 'ตัวเอง' อย่างชัดเจนใน Python ได้อย่างไร?


131

ฉันได้รับการเรียนรู้หลามโดยทำตามบางบทเรียน pygame

ในนั้นผมพบว่าการใช้งานที่กว้างขวางของคำหลักที่ตัวเองและมาจากพื้นหลัง Java ส่วนใหญ่ฉันพบว่าฉันให้ลืมที่จะพิมพ์ด้วยตนเอง ตัวอย่างเช่นแทนที่self.rect.centerxฉันจะพิมพ์rect.centerxเพราะสำหรับฉันแล้วrectเป็นตัวแปรสมาชิกของคลาสอยู่แล้ว

ขนาน Java ฉันจะคิดว่าสำหรับสถานการณ์นี้จะมีคำนำหน้าการอ้างอิงถึงตัวแปรสมาชิกด้วยนี้

ฉันติดคำนำหน้าตัวแปรสมาชิกทั้งหมดด้วยตนเองหรือมีวิธีการประกาศตัวแปรที่ทำให้ฉันหลีกเลี่ยงไม่ได้หรือไม่

แม้ว่าสิ่งที่ฉันแนะนำจะไม่ใช่pythonicแต่ฉันก็ยังอยากรู้ว่าเป็นไปได้ไหม

ฉันได้ดูคำถาม SO ที่เกี่ยวข้องเหล่านี้แล้ว แต่พวกเขาไม่ค่อยตอบในสิ่งที่ฉันต้องการ:


5
ฉันมาจากพื้นหลัง Java และพบว่ามันเป็นธรรมชาติ แต่ฉันเพิ่ม "this" อย่างชัดเจนในการเรียกทุกครั้งเพื่อให้ชัดเจนขึ้นว่าฉันกำลังอ้างถึงตัวแปรอินสแตนซ์
Uri

4
คุณคุ้นเคยกับรูปแบบของm_คำนำหน้าสำหรับชื่อสมาชิกทั้งหมดที่พบโดยโปรแกรมเมอร์ C ++ / Java หรือไม่? การใช้ตัวself.ช่วยในการอ่านในลักษณะเดียวกัน นอกจากนี้คุณควรอ่านdirtsimple.org/2004/12/python-is-not-java.html
Beni Cherniavsky-Paskin

2
แม้ว่าโดยปกติm_จะใช้สำหรับสมาชิกข้อมูลที่ไม่ใช่แบบคงที่สาธารณะเท่านั้น (อย่างน้อยใน C ++)

@ Beni บทความเชื่อมโยงที่ยอดเยี่ยมและใช่ฉันทำตามหลักการใช้mVariableNameสำหรับตัวแปรสมาชิกเมื่อเขียนโค้ดใน Java ฉันคิดว่าความคิดเห็นของ @ Anurag สรุปได้ค่อนข้างดีสำหรับสิ่งที่ java dev ควรทำเมื่อเรียนรู้ python
bguiz

11
แล้วทำไมทุกคนถึงบอก OP ว่าทำไมการใช้ self เป็นสิ่งที่ดี / จำเป็น / ฯลฯ แต่ไม่มีใครบอกว่าสามารถหลีกเลี่ยงได้หรือไม่? แม้ว่าจะด้วยกลอุบายสกปรกบางอย่างก็ตาม?
einpoklum

คำตอบ:


99

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

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

class A(some_function()):
  def f(self):
    self.member = 42
    self.method()

นั่นคือรหัสที่สมบูรณ์ ! (some_function คืนค่าประเภทที่ใช้เป็นฐาน)

อีกประการหนึ่งที่เมธอดของคลาสประกอบด้วยแบบไดนามิก:

class B(object):
  pass

print B()
# <__main__.B object at 0xb7e4082c>

def B_init(self):
  self.answer = 42
def B_str(self):
  return "<The answer is %s.>" % self.answer
# notice these functions require no knowledge of the actual class
# how hard are they to read and realize that "members" are used?

B.__init__ = B_init
B.__str__ = B_str

print B()
# <The answer is 42.>

โปรดจำไว้ว่าทั้งสองตัวอย่างนี้สุดโต่งและคุณจะไม่เห็นมันทุกวันและฉันไม่แนะนำว่าคุณควรเขียนโค้ดแบบนี้บ่อยๆ แต่ก็แสดงให้เห็นถึงแง่มุมของตัวเองที่จำเป็นอย่างชัดเจน


4
ขอบคุณ. คำตอบนี้ฮิตจุด cos selfมันยังได้อธิบายถึงประโยชน์ของการใช้
bguiz

2
@ Roger Pate: โปรดหยุดแก้ไขคำถามของฉันเพื่อลบ python ออกจากมัน ฉันคิดว่ามันเป็นของที่นั่น (และขอบคุณสำหรับคำตอบ!)
bguiz

3
@bguiz: มันเป็นแบบแผนดังนั้นที่จะไม่ทำซ้ำแท็กในชื่อเรื่อง อย่างไรก็ตามเมื่อฉันแก้ไขเมื่อ 2 วันก่อนฉันไม่เห็นว่าคุณเปลี่ยนชื่อเรื่องเมื่อ 7 เดือนที่แล้ว

1
คงจะดีไม่น้อยหากสามารถลดทอนตัวตนให้เหลือเพียงอักขระเดียวได้
dwjohnston

5
นั่นเป็นเหตุผลที่ฟังดูงี่เง่า Python ไม่สามารถยอมรับการสร้างเงาได้และต้องการให้คุณประกาศโดยเฉพาะนั่นคือ 'อวยพร' ฟิลด์เงาของคุณด้วย__shadow__ myFieldNameไฟล์. นั่นจะป้องกันการเกิดเงาโดยไม่ได้ตั้งใจเช่นกันใช่ไหม?
einpoklum

39

คำตอบก่อนหน้านี้ล้วน แต่เป็นตัวแปรของ "คุณทำไม่ได้" หรือ "คุณไม่ควร" ในขณะที่ฉันเห็นด้วยกับความรู้สึกหลัง แต่ในทางเทคนิคคำถามก็ยังไม่มีคำตอบ

นอกจากนี้ยังมีเหตุผลที่ถูกต้องว่าทำไมบางคนอาจต้องการทำอะไรบางอย่างตามบรรทัดของสิ่งที่คำถามจริงกำลังถาม สิ่งหนึ่งที่ฉันพบในบางครั้งคือสมการคณิตศาสตร์ที่ยาวซึ่งการใช้ชื่อยาวทำให้ไม่สามารถจดจำสมการได้ ต่อไปนี้เป็นวิธีการสองสามวิธีที่คุณสามารถทำได้ในตัวอย่างสำเร็จรูป:

import numpy as np
class MyFunkyGaussian() :
    def __init__(self, A, x0, w, s, y0) :
        self.A = float(A)
        self.x0 = x0
        self.w = w
        self.y0 = y0
        self.s = s

    # The correct way, but subjectively less readable to some (like me) 
    def calc1(self, x) :
        return (self.A/(self.w*np.sqrt(np.pi))/(1+self.s*self.w**2/2)
                * np.exp( -(x-self.x0)**2/self.w**2)
                * (1+self.s*(x-self.x0)**2) + self.y0 )

    # The correct way if you really don't want to use 'self' in the calculations
    def calc2(self, x) :
        # Explicity copy variables
        A, x0, w, y0, s = self.A, self.x0, self.w, self.y0, self.s
        sqrt, exp, pi = np.sqrt, np.exp, np.pi
        return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
                * exp( -(x-x0)**2/w**2 )
                * (1+s*(x-x0)**2) + y0 )

    # Probably a bad idea...
    def calc3(self, x) :
        # Automatically copy every class vairable
        for k in self.__dict__ : exec(k+'= self.'+k)
        sqrt, exp, pi = np.sqrt, np.exp, np.pi
        return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
                * exp( -(x-x0)**2/w**2 )
                * (1+s*(x-x0)**2) + y0 )

g = MyFunkyGaussian(2.0, 1.5, 3.0, 5.0, 0.0)
print(g.calc1(0.5))
print(g.calc2(0.5))
print(g.calc3(0.5))

ตัวอย่างที่สาม - เช่นการใช้for k in self.__dict__ : exec(k+'= self.'+k)เป็นสิ่งที่คำถามกำลังถามจริง ๆ แต่ขอให้ชัดเจนว่าโดยทั่วไปฉันไม่คิดว่ามันเป็นความคิดที่ดี

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

อัปเดต:ดูเหมือนจะไม่มีวิธีอัปเดตหรือเปลี่ยนภาษาในท้องถิ่นแบบไดนามิกในฟังก์ชันใน Python3 ดังนั้นจึงไม่สามารถใช้ calc3 และตัวแปรที่คล้ายกันได้อีกต่อไป โซลูชันเดียวที่เข้ากันได้กับ python3 ที่ฉันคิดได้ตอนนี้คือใช้globals:

def calc4(self, x) :
        # Automatically copy every class variable in globals
        globals().update(self.__dict__)
        sqrt, exp, pi = np.sqrt, np.exp, np.pi
        return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
                * exp( -(x-x0)**2/w**2 )
                * (1+s*(x-x0)**2) + y0 )

ซึ่งอีกครั้งจะเป็นการปฏิบัติที่แย่มากโดยทั่วไป


4
ยอดเยี่ยม! นี่คือคำตอบที่ถูกต้องที่สุด (เท่านั้น?) +1 นอกจากนี้คุณยังให้เหตุผลที่เป็นประโยชน์ในการทำเช่นนั้น +1i
David Lotts

หลังจากสร้างคลาสและย้ายโค้ดเข้าไปข้างในตอนนี้เมธอดและตัวแปรทั้งหมดไม่ได้รับการยอมรับอีกต่อไปแล้ว (ไม่ใช่ตัวมันเอง .. ) ฉันนึกถึงอีกเหตุผลหนึ่งที่หลามและฉันไม่เข้ากัน ขอบคุณสำหรับไอเดียนี้ ไม่สามารถแก้ไขปัญหา / ปวดหัว / อ่านไม่ได้โดยรวม แต่ให้วิธีแก้ปัญหาเล็กน้อย
javadba

ทำไมไม่อัปเดตlocalsแทนที่จะใช้exec?
นาธาน

ฉันพยายามlocals().update(self.__dict__)ใน python 2 และ 3 แต่ไม่ได้ผล ใน python3 แม้แต่เคล็ดลับ 'exec' ก็ไม่ใช่ตัวเลือกอีกต่อไป ในทางกลับกันได้globals().update(self.__dict__)ผล แต่จะเป็นการปฏิบัติที่แย่มากโดยทั่วไป
argentum2f

26

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


1
คำตอบนี้โดยเฉพาะประโยคที่ 2 มีประโยชน์มากกว่าคำตอบที่ยอมรับสำหรับฉันมากเพราะฉันสามารถรู้ว่า 'ตัวตนที่ชัดเจน' เป็นเพียงหนึ่งในข้อ จำกัด ใน Python และไม่สามารถหลีกเลี่ยงได้
QuestionDriven

21

คุณสามารถใช้ชื่ออะไรก็ได้ที่คุณต้องการเช่น

class test(object):
    def function(this, variable):
        this.variable = variable

หรือแม้กระทั่ง

class test(object):
    def function(s, variable):
        s.variable = variable

แต่คุณติดอยู่กับการใช้ชื่อสำหรับขอบเขต

ฉันไม่แนะนำให้คุณใช้สิ่งที่แตกต่างกับตัวเองเว้นแต่คุณจะมีเหตุผลที่น่าเชื่อถือเพราะมันจะทำให้มันเป็นมนุษย์ต่างดาวสำหรับ pythonistas ที่มีประสบการณ์


26
ทำได้ แต่อย่า ! ไม่มีเหตุผลที่จะทำให้โค้ดของคุณแปลกกว่าที่ควรจะเป็น ใช่คุณสามารถเรียกมันว่าอะไรก็ได้ แต่การประชุมคือการเรียกมันselfและคุณควรทำตามการประชุม จะทำให้โค้ดของคุณเข้าใจง่ายขึ้นสำหรับโปรแกรมเมอร์ Python ที่มีประสบการณ์ที่ดูมัน (รวมถึงคุณหกเดือนจากนี้พยายามคิดว่าโปรแกรมเก่าของคุณทำอะไรบ้าง!)
สตีเวฮา

3
คนต่างด้าวมากยิ่งขึ้น:def function(_, variable): _.variable = variable
Bob Stein

1
@ BobStein-VisiBone คนต่างด้าวมากยิ่งขึ้น:def funcion(*args): args[0].variable = args[1]
Aemyl

4
@steveha เขาไม่แนะนำข้อมูลนี้เป็นประโยชน์มากสำหรับคนอย่างฉันที่ไม่รู้ว่าคุณสามารถใช้คีย์เวิร์ดต่างจากตัวเองได้และสงสัยว่าทำไมอ็อบเจกต์ของคลาสของตัวเองจึงถูกส่งไป
Sven van den Boogaart

> "แปลกประหลาด". Python นั้นแปลก - โดยเฉพาะโครงสร้างคลาสและการใช้ตัวเองนี้เป็นนกขมิ้นเพื่อรองรับการต่อต้านการอ่าน ฉันรู้ว่าจะมีกองหลังหลายคนตามมาหลังจากนี้ แต่นั่นไม่ได้เปลี่ยนความจริง
javadba

9

ใช่คุณต้องระบุเสมอselfเพราะ Explicit ดีกว่าโดยนัยตามปรัชญาของ python

นอกจากนี้คุณจะพบว่าวิธีที่คุณเขียนโปรแกรมใน python นั้นแตกต่างจากวิธีที่คุณเขียนโปรแกรมใน java มากดังนั้นการใช้งานselfจึงมีแนวโน้มที่จะลดลงเนื่องจากคุณไม่ได้ฉายทุกอย่างภายในวัตถุ แต่คุณใช้ประโยชน์จากฟังก์ชันระดับโมดูลมากขึ้นซึ่งสามารถทดสอบได้ดีกว่า

ยังไงซะ. ตอนแรกฉันเกลียดมันตอนนี้ฉันเกลียดตรงข้าม เหมือนกันสำหรับการควบคุมการไหลแบบเยื้องศูนย์


2
"คุณใช้ประโยชน์จากฟังก์ชันระดับโมดูลมากขึ้นซึ่งสามารถทดสอบได้ดีขึ้น" เป็นเรื่องน่าสงสัยและฉันต้องไม่เห็นด้วยอย่างยิ่ง เป็นความจริงที่คุณไม่ได้ถูกบังคับให้ทำทุกอย่างเป็นวิธีการ (คงที่หรือไม่) ของคลาสบางคลาสไม่ว่าจะเป็น "ระดับโมดูลเชิงตรรกะ" ก็ตาม แต่นั่นไม่เกี่ยวข้องกับตัวเองและไม่มีผลกระทบอย่างมีนัยสำคัญต่อ ทดสอบไม่ทางใดก็ทางหนึ่ง (สำหรับฉัน)

มันเกิดขึ้นจากประสบการณ์ของฉัน ฉันไม่ได้ทำตามมันเป็นมนต์ทุกครั้ง แต่มันทำให้การทดสอบง่ายขึ้นว่าคุณใส่อะไรที่ไม่ต้องการการเข้าถึงตัวแปรสมาชิกเป็นวิธีแยกต่างหากที่เป็นอิสระ ใช่คุณแยกตรรกะออกจากข้อมูลซึ่งใช่ขัดกับ OOP แต่อยู่ด้วยกันในระดับโมดูลเท่านั้น ฉันไม่ให้เครื่องหมาย "ดีที่สุด" อย่างใดอย่างหนึ่งเป็นเพียงเรื่องของรสนิยม บางครั้งฉันพบว่าตัวเองระบุเมธอดของคลาสที่ไม่มีส่วนเกี่ยวข้องกับคลาสนั้นเองโดยที่พวกเขาไม่ได้สัมผัสselfแต่อย่างใด อะไรคือจุดสำคัญในการมีพวกเขาในชั้นเรียน?
Stefano Borini

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

5
ใช่แน่นอนคุณทำได้ แต่วิธีการนั้นแตกต่างกัน วัตถุมีสถานะวิธีการระดับโมดูลไม่มี หากคุณพบว่าการทดสอบล้มเหลวในขณะทดสอบเมธอดระดับคลาสอาจมีสองสิ่งผิดพลาด: 1) สถานะอ็อบเจ็กต์ในขณะที่ทำการเรียก 2) เมธอดนั้นเอง หากคุณมีเมธอดระดับโมดูลไร้สถานะกรณีที่ 2 เท่านั้นที่สามารถเกิดขึ้นได้ คุณย้ายการตั้งค่าจากออบเจ็กต์ (โดยที่มันเป็นกล่องดำตามที่การทดสอบเกี่ยวข้องเนื่องจากมันถูกควบคุมโดยตรรกะที่ซับซ้อนในที่สุดในวัตถุ) ไปยัง testsuite คุณกำลังลดความซับซ้อนและควบคุมการตั้งค่าให้เข้มงวดยิ่งขึ้น
Stefano Borini

1
"ถ้าคุณมีวิธีระดับโมดูลแบบไร้สถานะ" แล้ววิธีการระดับโมดูลที่มีสถานะเป็นอย่างไร สิ่งที่คุณบอกฉันก็คือฟังก์ชันไร้สัญชาตินั้นทดสอบได้ง่ายกว่าฟังก์ชันที่ไม่มีสถานะและฉันจะเห็นด้วย แต่มันไม่เกี่ยวข้องกับวิธีการและไม่ใช่วิธีการ ดูพารามิเตอร์ตัวเองตามนั้น: เพียงพารามิเตอร์อื่นของฟังก์ชัน

4

"ตัวเอง" คือตัวยึดแบบเดิมของอินสแตนซ์อ็อบเจ็กต์ปัจจุบันของคลาส ใช้เมื่อคุณต้องการอ้างถึงคุณสมบัติของวัตถุหรือฟิลด์หรือวิธีการภายในคลาสราวกับว่าคุณกำลังอ้างถึง "ตัวมันเอง" แต่เพื่อให้สั้นลงบางคนในขอบเขตการเขียนโปรแกรม Python เริ่มใช้ "self" อาณาจักรอื่นใช้ "this" แต่ทำให้เป็นคีย์เวิร์ดที่ไม่สามารถแทนที่ได้ ฉันค่อนข้างใช้ "มัน" เพื่อเพิ่มความสามารถในการอ่านโค้ด สิ่งที่ดีอย่างหนึ่งใน Python - คุณมีอิสระในการเลือกตัวยึดตำแหน่งของคุณเองสำหรับอินสแตนซ์ของวัตถุอื่นที่ไม่ใช่ "ตัวเอง" ตัวอย่างสำหรับตนเอง:

class UserAccount():    
    def __init__(self, user_type, username, password):
        self.user_type = user_type
        self.username = username            
        self.password = encrypt(password)        

    def get_password(self):
        return decrypt(self.password)

    def set_password(self, password):
        self.password = encrypt(password)

ตอนนี้เราแทนที่ 'self' ด้วย 'its':

class UserAccount():    
    def __init__(its, user_type, username, password):
        its.user_type = user_type
        its.username = username            
        its.password = encrypt(password)        

    def get_password(its):
        return decrypt(its.password)

    def set_password(its, password):
        its.password = encrypt(password)

ตอนนี้อ่านเรื่องไหนได้มากกว่า


ทำไมไม่เพียงs(หรือตัวอักษรเดี่ยวอื่น ๆ ) แทนที่จะเป็นits
javadba

'มัน' มีความหมายและ 's' ไม่มี
LEMUEL ADANE

sมีความหมายเหมือนกัน: นามแฝงของอินสแตนซ์คลาส ฉันต้องค้นหาความitsหมายในบริบทที่เหมือนกัน
javadba

ทั้งสองไม่สามารถอ่านได้สำหรับฉัน การเอา "ตัวเอง" มาเป็นพารามิเตอร์ภายนอกมันยังไม่มีเหตุผล
Cesar

3

self เป็นส่วนหนึ่งของไวยากรณ์ python เพื่อเข้าถึงสมาชิกของวัตถุดังนั้นฉันกลัวว่าคุณจะติดอยู่กับมัน


2
self เป็นวิธีบอกตัวปรับการเข้าถึงโดยไม่ต้องใช้จริงๆ +1
Perpetualcoder

1

จริงๆแล้วคุณสามารถใช้สูตร "ตัวเองโดยนัย" จากการนำเสนอของ Armin Ronacher "5 years of bad ideas" (google it)

มันเป็นสูตรอาหารที่ฉลาดมากเกือบทุกอย่างจาก Armin Ronacher แต่ฉันไม่คิดว่าไอเดียนี้จะน่าสนใจมาก ฉันคิดว่าฉันต้องการสิ่งนี้อย่างชัดเจนใน C # / Java

ปรับปรุง ลิงก์ไปยัง "สูตรคิดไม่ดี": https://speakerdeck.com/mitsuhiko/5-years-of-bad-ideas?slide=58


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

ไม่ "ความคิดที่ไม่ดี" ของอาร์มินดูตลกมากกว่าสำหรับรสนิยมของฉัน ฉันรวมลิงค์
Alex Yu

ก่อนที่คุณจะคลิกลิงก์สูตรโปรดทราบว่าสิ่งนี้ทำให้เกิดความหมายโดยนัยในรายการพารามิเตอร์def method(<del> self </del> )แต่self.variableยังจำเป็นสำหรับการแฮ็กที่ชาญฉลาดนี้
David Lotts

0

ใช่ตัวเองน่าเบื่อ แต่จะดีกว่าไหม

class Test:

    def __init__(_):
        _.test = 'test'

    def run(_):
        print _.test

10
_มีความหมายพิเศษใน Python shell ซึ่งเก็บค่าที่ส่งคืนล่าสุด ใช้แบบนี้ได้อย่างปลอดภัย แต่อาจทำให้สับสนได้ ฉันจะหลีกเลี่ยงมัน
Cairnarvon

ไม่ดีกว่า แต่ทำไมไม่ใช้ตัวอักษรเดี่ยวแทนเช่นsหรือm(เพื่อเลียนแบบ C ++)
Javadba

0

จาก: Self Hell - ฟังก์ชั่นสถานะเพิ่มเติม

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


การปิดเป็นสิ่งที่ดีสำหรับกรณีการใช้งานขนาดเล็ก แต่การใช้งานเพิ่มเติมจะเพิ่มค่าใช้จ่ายหน่วยความจำของโปรแกรมค่อนข้างมาก (เนื่องจากคุณใช้ OO ที่ใช้ต้นแบบมากกว่า OO ตามคลาสดังนั้นแต่ละวัตถุจึงต้องการชุดฟังก์ชันของตัวเอง ค่อนข้างเก็บชุดฟังก์ชันทั่วไปไว้ในคลาส) ยิ่งไปกว่านั้นมันจะทำให้คุณไม่สามารถใช้เวทมนตร์ / วิธีการหลอกลวงได้ (เช่น__str__และอื่น ๆ ) เนื่องจากสิ่งเหล่านี้ถูกเรียกใช้ในลักษณะที่แตกต่างจากวิธีการปกติ
Dunes

0

ฉันคิดว่ามันจะง่ายกว่าและอ่านได้ง่ายขึ้นถ้ามีคำว่า "member" เหมือนกับที่มีคำว่า "global" เพื่อที่คุณจะได้บอกล่ามซึ่งเป็นอ็อบเจกต์ที่เป็นสมาชิกของคลาส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.