ক্লাসের মধ্যে পাইথন কল ফাংশন


242

আমার কাছে এই কোডটি রয়েছে যা দুটি স্থানাঙ্কের মধ্যে দূরত্ব গণনা করে। দুটি ফাংশন উভয়ই একই শ্রেণীর মধ্যে।

তবে ফাংশন কিভাবে কল distToPointফাংশনে isNear?

class Coordinates:
    def distToPoint(self, p):
        """
        Use pythagoras to find distance
        (a^2 = b^2 + c^2)
        """
        ...

    def isNear(self, p):
        distToPoint(self, p)
        ...

41
চেষ্টা করুন: self.distToPoint (p)
মোমারা

যদি হয় নিকট এবং ডিস্টোপয়েন্টটি বিভিন্ন যুক্তি নিচ্ছে। তারপরে আমরা ক্লাসের ভিতরে থাকা ডিস্টটোয়েন্টকে কীভাবে বলতে পারি? দয়া করে আমার জন্য যে কেউ এটি ব্যাখ্যা করতে পারেন।
রাঘবেন্দ্র গুপ্ত

উত্তর:


394

যেহেতু এটি সদস্য ফাংশন, তাই এটিকে সদস্য ফাংশন হিসাবে কল করুন self

def isNear(self, p):
    self.distToPoint(p)
    ...

2
তবে সাবধান থাকুন স্ব.ফু () পদ্ধতিটির ক্রমটি অর্ডারটি ব্যবহার করবে যা কোনও ভিন্ন শ্রেণীর কোনও ফাংশনে সমাধান হতে পারে।
ফ্রান্সিস ডেভে

আমরা যদি স্ব ব্যবহার না করি তবে কী হবে? এবং সরাসরি ডিস্টোপয়েন্ট (পি) কল করবেন?
মার্লন আবেইকুন

3
@ মারলন আবেইকুন "স্ব" যুক্তিটি অনুপস্থিত হবে
পিটিপাতি

1
যদি হয় নিকট এবং ডিস্টোপয়েন্টটি বিভিন্ন যুক্তি নিচ্ছে। তারপরে আমরা ক্লাসের ভিতরে থাকা ডিস্টটোয়েন্টকে কীভাবে বলতে পারি? দয়া করে আমার জন্য যে কেউ এটি ব্যাখ্যা করতে পারেন।
রাঘবেন্দ্র গুপ্ত

46

এতে কাজ না হলে কারণ distToPoint, আপনার বর্গ ভিতরে, তাই আপনি classname সঙ্গে এটি তার প্রিফিক্স যদি এই মত উল্লেখ করতে চান প্রয়োজন: classname.distToPoint(self, p)। যদিও আপনার এটি করা উচিত নয়। এটা করতে একটি ভাল উপায় তাই মত বর্গ উদাহরণস্বরূপ মাধ্যমে সরাসরি পদ্ধতি উল্লেখ করতে (যা একটি বর্গ পদ্ধতি প্রথম যুক্তি), হল: self.distToPoint(p)


@Aleski। যদি এটি একটি জেনেরিক পদ্ধতি (সমস্ত দৃষ্টিতে সাধারণ এবং কোনও পদ্ধতিতে নির্দিষ্ট উল্লেখগুলির ব্যতীত) সাধারণ হয় তবে আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন কারও শ্রেণি নাম.ডিসিস্টটিপয়েন্ট (স্ব, পি) ব্যবহার করা উচিত নয়?
ইউগমরফ

2
@ ইউগমরফ: কেবলমাত্র একটি পরিস্থিতি যেখানে একজনকে ব্যবহার করা উচিত classname.distToPoint(self, p): আপনি যখন একটি সাবক্লাসটি সংজ্ঞায়িত করেন যা ওভাররাইড হয় তবে মূলটিকে distToPointকল করতে হবে। যদি আপনি self.distToPoint(p)সেই ক্ষেত্রে স্বাভাবিকের মতো কল করার চেষ্টা করে থাকেন তবে আপনি যে পদ্ধতিটি স্রেফ সংজ্ঞায়িত করছেন তা কল করে শেষ করবেন এবং অসীম পুনরাবৃত্তিতে যাবেন। যদি কোনও শ্রেণীর ভিতরে না থাকে তবে কেবলমাত্র একটি পরিস্থিতি যেখানে আপনি classname.distToPoint(obj, p)পরিবর্তে ব্যবহার করতেন obj.distToPoint(p): যদি আপত্তিটি সাবক্লাসের উদাহরণ হতে পারে তবে আপনাকে মূল distToPointসংজ্ঞায়িত (চালিয়ে যাওয়া)
আলেক্সি টোরহামো

1
মধ্যে classnameকিন্তু মনে রাখবেন যে এই খুব হল hacky এবং একটি ছাড়া সাধারণভাবে সম্পন্ন করা হবে - উপশ্রেণী ওভাররাইড করা সংস্করণের পরিবর্তে খুব ভাল কারণ। নোট করুন যে আপনি ক্লাসের মাধ্যমে স্পষ্টভাবে কোনও পদ্ধতি কল করার সময় আপনি সাব টাইপ পলিমারফিজমটি ভঙ্গ করেন (উপরের উদাহরণগুলির উভয় ক্ষেত্রেই আপনি বিশেষভাবে এটি করতে চান )। তাই সংক্ষিপ্ত: প্রতিবার আপনি কেবলমাত্র একটি পদ্ধতি স্পষ্টভাবে একটি বর্গ মাধ্যমে কল করা উচিত যখন আপনি প্রয়োজন কয়েকটি [ভাল] কারণে পাশকাটিয়ে উপপ্রকার পলিমরফিজম করতে। যদি পদ্ধতিটি ওভাররাইড না করা হয়, তবে দুটি উপায় সমান, তবে self.distToPoint(p)খাটো এবং আরও বেশি পাঠযোগ্য, (চালিয়ে যাওয়া)
আলেক্সি তোড়হামো

সুতরাং আপনার অবশ্যই এটি ব্যবহার করা উচিত। এখন, আপনার প্রশ্নের সুনির্দিষ্ট বৈশিষ্ট্যে পৌঁছে যা: আপনার পদ্ধতিটি যদি কোনও উদাহরণ ভেরিয়েবল ব্যবহার না করে, তবে এটি পরিবর্তে একটি শ্রেণিবদ্ধ হওয়া উচিত? আপনি @classmethodপদ্ধতির আগে যুক্ত করে এগুলি তৈরি করেন, এবং এর পরে আপনি selfপ্রথম যুক্তি হিসাবে কোনও উদাহরণ ( ) পাবেন না - পরিবর্তে আপনি ক্লাস পাবেন, সুতরাং আপনার প্রথম যুক্তির নাম রাখা উচিত যেমন। clsপরিবর্তে. এর পরে, আপনি ক্লাসমোথডকে কল করতে পারেন হয় পছন্দ করুন obj.distToPoint(p)বা classname.distToPoint(p)(অভাবটি নোট করুন obj)। আপনার এখনও সম্ভবত ব্যবহার করা উচিত (অব্যাহত)
আলেকসি তোড়হামো

obj.distToPoint(p)তবে, যদি আপনার হাতে কেবল কোনও প্রাসঙ্গিক উদাহরণ থাকে তবে - যদি না - আবার - আপনার কাছে সাব-টাইপ পলিমারফিজমকে রোধ করার কিছু [ভাল] কারণ আছে, যেহেতু সাধারণভাবে, শ্রেণীবদ্ধ একটি সাবক্লাসে ওভাররাইড করা যেতে পারে। অবশ্যই, যদি আপনার কোনও প্রাসঙ্গিক উদাহরণ উপলব্ধ না থাকে তবে আপনি অবশ্যই কোনও ক্লাসের মাধ্যমে কোনও ক্লাসমেথকে কল করতে হবে ।
আলেক্সি তোড়হামো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.