Python class czy klasa musi zaczynać się od __init__

0

Witajcie, mam pytanie odnośnie klas w Pythonie, piszę program składający się z kilku klas, każda z nich jest w osobnym pliku. Moje pytanie czy każdy plik z klasą musi zaczynać się od definicji init czy po prostu może być tak:

import jakis_plik
import tkinter as tk

class Program:
     def save_path(self):
        self.input_name_company = tk.StringVar()

        self.top = tk.Tk()
        self.top.geometry("600x430+40+20")
        self.top.configure(background="black")

        self.rama = tk.LabelFrame(self.window, bg="black", fg="white", padx=5, pady=5)
        self.rama.pack(padx=5, pady=5)

itd

i jak odwołać się do definicji save_path czy może być: jakiś_plik.Program.save_path(), czy to odwołanie jest poprawne?

3

Nie musisz tego dodawac , po prostu wiele klas lubi miec zdefiniowana wartosc stad daja to init ale jak nie dasz to stworysz pusty objekt

3

__init__ to konstruktor klasy. Jak chcesz, żeby istniał i miał jakąś swoją logikę, to go musisz napisać. Jak nie… to nie. Jak go nie zrobisz, to tak jak pisał masterc — go nie będzie. I jak będziesz tworzyć obiekt, to stworzysz go domyślnie, tylko na jeden sposób, ze wszelkimi zmiennymi składowymi domyślnymi. Czy Ci to pasuje — nie wiemy, zależy od konkretnego zastosowania. Pewnie będziesz miał zresztą w programie i takie, i takie klasy.

Ogólnie, konstruktory się używa do zapewnienia pewnych niezmienników w klasie — do zagwarantowania, że każda jej instancja działa w pewien określony sposób, daje pewne gwarancje. Np. możesz chcieć mieć klasę PESEL, która przy tworzeniu dokonuje walidacji. I w ten sposób wiesz na pewno, że każdy egzemplarz PESEL-a zawiera poprawny numer.

0

Witam
Podłączę się pod temat. Zgłębiam klasy i takie coś mnie zastanawia:

class Objekt():
	idObjektu=1
	def __init__(self,a=None,b=None):
		self.a=a
		self.b=b
		self.nrId=self.idObjektu
		self.__class__.idObjektu+=1

	@classmethod
	def c_wypiszId(cls):
		print("Cl. Następne id:",cls.idObjektu)

	def m_wypisz(self):
		print("Wypisuję:",self.nrId,self.a,self.b)
	
	def m_wypiszId():
		print("Mt. Nastepne id:",__class__.idObjektu)

glObjekty=[]
for x in range(22):
	glObjekty.append(Objekt(12+x,13-x))
	glObjekty[x].m_wypisz()
Objekt.m_wypiszId()
Objekt.c_wypiszId()

Czy można zamiennie lub coś jest lepsze: @classmethod lub dostęp przez normalną metodę. Wynik ten sam i wywołanie to samo.
Jak to jest?

Pozdrawiam
Radosław Głębicki

0

Zależy do czego i w jaki sposób potrzebujesz dostęp.
@classmethod - działa jak wywołujesz zarówno z obiektu i z klasy. Ma dostęp do atrybutów klasy, ale nie instancji.

@staticmethod - działa jak wywołujesz zarówno z obiektu i z klasy. Nie ma dostępu do żadnych atrybutów.

bez dekoratora z self - działa jak wywołujesz z obiektu, z klasy nie. Ma dostęp do atrybutów klasy i instancji.

bez dekoratora i bez self - działa jak wywołujesz z klasy, z obiektu nie. Ma dostęp do atrybutów klasy, do obiektu oczywiście nie.

2

Czyli jednym słowem lepiej używać init, dzięki za pomoc.

@masterc wyjaśnił mi na priv to co właściwie chciałem, więc temat zamknięty

1 użytkowników online, w tym zalogowanych: 0, gości: 1