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 @classmethod
metodu 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, Person
yaş değişkeninin 25'e atandığı bir sınıfımız var .
Ayrıca printAge
tek bir parametreyi alan ve self
genellikle almadığımız bir fonksiyonumuz var .
cls, sınıfı Person'un Person
nesnesi / örneği yerine bir parametre olarak kabul eder .
Şimdi, yöntemi Person.printAge
bir 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, printAge
statik 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 fromBirthYear
yöntem.
Yapıcı, normal parametrelerin adını ve yaşını alır. , İken fromBirthYear
sı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, fromBirthYear
bir 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 Person
için Man
.
fromFathersAge
yöntem bir Man
nesne 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 .