পূর্ববর্তী উত্তরগুলি মূলত "আপনি পারবেন না" বা "আপনার করা উচিত নয়" এর বৈকল্পিক। যদিও আমি পরবর্তী অনুভূতির সাথে একমত, প্রশ্নটি প্রযুক্তিগতভাবে এখনও উত্তরহীন।
তদুপরি, বৈধ কারণগুলি রয়েছে যে কেউ সত্যিকারের প্রশ্নটি জিজ্ঞাসা করছে তার লাইনে কিছু করতে চায়। একটি বিষয় যা আমি মাঝে মাঝে চালাই তা হ'ল দীর্ঘতর গণিতের সমীকরণ যেখানে দীর্ঘ নাম ব্যবহার করা সমীকরণটিকে অচেনাযোগ্য করে তোলে। আপনি কীভাবে এটি একটি বানানো উদাহরণে এটি করতে পারেন তার কয়েকটি উপায় এখানে:
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)
হ'ল মূলত যা প্রশ্নটি জিজ্ঞাসা করে তা হ'ল তবে আমাকে পরিষ্কার করে দেওয়া উচিত যে আমি সাধারণত এটি একটি ভাল ধারণা বলে মনে করি না।
আরও তথ্যের জন্য এবং ক্লাস ভেরিয়েবলগুলি বা এমনকি ফাংশনগুলির মাধ্যমে পুনরাবৃত্তি করার উপায়গুলির জন্য, এই প্রশ্নের উত্তর এবং আলোচনা দেখুন । পরিবর্তনশীল নামগুলি পরিবর্তনশীল করার অন্যান্য উপায়গুলির আলোচনার জন্য এবং কেন এটি সাধারণত ভাল ধারণা হয় না এই ব্লগ পোস্টটি দেখুন ।
আপডেট: পাইথন 3-এ কোনও ক্রিয়াকলাপে স্থানীয়দের পরিবর্তনশীল আপডেট বা পরিবর্তন করার কোনও উপায় নেই বলে মনে হয় , সুতরাং ক্যালক 3 এবং অনুরূপ রূপগুলি আর সম্ভব হয় না। আমি এখন যে পাইথন 3 এর সামঞ্জস্যপূর্ণ সমাধানটি ভাবতে পারি তা হ'ল 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 )
যা আবার সাধারণভাবে একটি ভয়াবহ অনুশীলন হবে।