Python sınıf yöntemi ()

Classmethod () yöntemi, verilen işlev için bir sınıf yöntemi döndürür.

classmethod()Yöntemin sözdizimi şöyledir:

 sınıf yöntemi (işlev)

classmethod()Pythonic olmayan kabul edilir, bu nedenle daha yeni Python sürümlerinde, sınıf @classmethodmetodu tanımı için dekoratör kullanabilirsiniz.

Sözdizimi şöyledir:

 @classmethod def func (cls, args…)

classmethod () Parametreler

classmethod() yöntem tek bir parametre alır:

  • function - Bir sınıf yöntemine dönüştürülmesi gereken işlev

Classmethod () değerinden dönüş değeri

classmethod() yöntem, verilen işlev için bir sınıf yöntemi döndürür.

Sınıf yöntemi nedir?

Bir sınıf yöntemi, nesnesi yerine bir sınıfa bağlı bir yöntemdir. Statik yöntem gibi, bir sınıf örneğinin oluşturulmasını gerektirmez.

Statik yöntem ile sınıf yöntemi arasındaki fark şudur:

  • Statik yöntem sınıf hakkında hiçbir şey bilmiyor ve sadece parametrelerle ilgileniyor
  • Sınıf yöntemi, parametresi her zaman sınıfın kendisi olduğu için sınıfla çalışır.

Sınıf yöntemi hem sınıf hem de nesnesi tarafından çağrılabilir.

 Class.classmethod () Veya hatta Class (). Classmethod ()

Ancak ne olursa olsun, sınıf yöntemi her zaman birinci argümanla bir sınıfa eklenir, çünkü sınıfın kendisi cls.

 def classMethod (cls, args…)

Örnek 1: classmethod () kullanarak sınıf yöntemi oluşturma

 class Person: age = 25 def printAge(cls): print('The age is:', cls.age) # create printAge class method Person.printAge = classmethod(Person.printAge) Person.printAge()

Çıktı

 Yaş: 25 

Burada, Personyaş değişkeninin 25'e atandığı bir sınıfımız var .

Ayrıca printAgetek bir parametreyi alan ve selfgenellikle almadığımız bir fonksiyonumuz var .

cls, sınıfı Person'un Personnesnesi / örneği yerine bir parametre olarak kabul eder .

Şimdi, yöntemi Person.printAgebir argüman olarak işleve aktarıyoruz classmethod. Bu, yöntemi bir sınıf yöntemine dönüştürür, böylece ilk parametreyi bir sınıf (yani Kişi) olarak kabul eder.

Son satırda, printAgestatik yöntemler için yaptığımız gibi bir Person nesnesi oluşturmadan çağırıyoruz . Bu, yaş değişkenini yazdırır.

Sınıf yöntemini ne zaman kullanıyorsunuz?

1. Fabrika yöntemleri

Fabrika yöntemleri, farklı kullanım durumları için bir sınıf nesnesi (yapıcı gibi) döndüren yöntemlerdir.

C ++ 'daki fonksiyon aşırı yüklemesine benzer. Python'da böyle bir şey olmadığından, sınıf yöntemleri ve statik yöntemler kullanılır.

Örnek 2: Sınıf yöntemini kullanarak fabrika yöntemi oluşturun

 from datetime import date # random Person class Person: def __init__(self, name, age): self.name = name self.age = age @classmethod def fromBirthYear(cls, name, birthYear): return cls(name, date.today().year - birthYear) def display(self): print(self.name + "'s age is: " + str(self.age)) person = Person('Adam', 19) person.display() person1 = Person.fromBirthYear('John', 1985) person1.display()

Çıktı

 Adem'in yaşı: 19 John'un yaşı: 31 

Burada iki sınıf örneği yaratıcımız var, bir yapıcı ve bir fromBirthYearyöntem.

Yapıcı, normal parametrelerin adını ve yaşını alır. , İken fromBirthYearsınıf, isim ve birthYear alır yılın ile çıkarılarak mevcut yaşı hesaplar ve sınıf örneğini döndürür.

FromBirthYear metot, birinci parametre CLS olarak kişi sınıf (değil Kişi nesnesi) alır ve çağrı ile kurucu döner cls(name, date.today().year - birthYear)eşdeğerdirPerson(name, date.today().year - birthYear)

Yöntemden önce görüyoruz @classmethod. Bu, fromBirthYearbir sınıf yöntemine dönüştürmek için bir dekoratör olarak adlandırılır classmethod().

2. Devralmada doğru örnek oluşturma

Bir fabrika yöntemini bir sınıf yöntemi olarak uygulamaktan bir sınıf türettiğinizde, türetilmiş sınıfın doğru örnek oluşturulmasını sağlar.

Yukarıdaki örnek için statik bir yöntem oluşturabilirsiniz, ancak oluşturduğu nesne her zaman Base sınıfı olarak kodlanacaktır.

Ancak, bir sınıf yöntemi kullandığınızda, türetilmiş sınıfın doğru örneğini oluşturur.

Örnek 3: Sınıf yöntemi kalıtım için nasıl çalışır?

 from datetime import date # random Person class Person: def __init__(self, name, age): self.name = name self.age = age @staticmethod def fromFathersAge(name, fatherAge, fatherPersonAgeDiff): return Person(name, date.today().year - fatherAge + fatherPersonAgeDiff) @classmethod def fromBirthYear(cls, name, birthYear): return cls(name, date.today().year - birthYear) def display(self): print(self.name + "'s age is: " + str(self.age)) class Man(Person): sex = 'Male' man = Man.fromBirthYear('John', 1985) print(isinstance(man, Man)) man1 = Man.fromFathersAge('John', 1965, 20) print(isinstance(man1, Man))

Çıktı

 Doğru yanlış 

Burada, bir sınıf örneği oluşturmak için statik bir yöntem kullanmak, oluşturma sırasında örnek türünü kodlamamızı ister.

Devralan Bu açıkça bir soruna neden Personiçin Man.

fromFathersAgeyöntem bir Mannesne döndürmez, ancak onun temel sınıfının nesnesini döndürür Person.

Bu, OOP paradigmasını ihlal ediyor. fromBirthYearİlk parametreyi sınıfın kendisi olarak aldığından ve fabrika yöntemini çağırdığından, kodun OOP-özelliğini sağlayabileceği gibi bir sınıf yöntemi kullanmak .

Ilginç makaleler...