İstihza belgelerinde init() fonksiyonu çok güzel anlatılmış fakat new() fonksiyonu hakkında hiçbir bilgi yok. En sağlam kaynak ysar.com o da meta sınıflar konusu arasına sıkıştırmış. Sağlam bir kaynak önerisi olan var mı?
Bence en sağlam kaynak önerisi Python’ın kendisi. Aşağıdaki fonksiyon özel metotların ne işe yaradıklarını içeren bir yardım dökümanı sunuyor. Orada new fonksiyonu hakkında bilgiler de var. Python dökümanında yazdığına göre new methodu statik bir metot.
help("SPECIALMETHODS")
Mesela aşağıdaki gibi bir sınıfımız olsun:
[code]class sınıf():
def init(self):
self.nitelik = 1
def __new__(cls):
cls.yeni_nitelik = 2
[/code]
Bu sınıftan bir nesne türetelim:
a = sınıf()
print(a.nitelik)
#Print işleminin sonunda konsola 1 değeri bastırılacaktır.
print(a.yeni_nitelik)
#Print işleminin sonunda AttributeError: 'NoneType' object has no attribute 'yeni_nitelik' şeklinde bir hata mesajı ekrana bastırılır.
print(sınıf.yeni_nitelik)
#Print işleminin sonunda konsola 2 değeri bastırılacaktır.
Python yardım kütüphanesinden alıntı:
object.__new__(cls[, ...])Called to create a new instance of class cls. “new()” is a
static method (special-cased so you need not declare it as such)
that takes the class of which an instance was requested as its
first argument. The remaining arguments are those passed to the
object constructor expression (the call to the class). The return
value of “new()” should be the new object instance (usually an
instance of cls).Typical implementations create a new instance of the class by
invoking the superclass’s “new()” method using
“super(currentclass, cls).new(cls[, …])” with appropriate
arguments and then modifying the newly-created instance as
necessary before returning it.If “new()” returns an instance of cls, then the new
instance’s “init()” method will be invoked like
“init(self[, …])”, where self is the new instance and the
remaining arguments are the same as were passed to “new()”.If “new()” does not return an instance of cls, then the new
instance’s “init()” method will not be invoked.“new()” is intended mainly to allow subclasses of immutable
types (like int, str, or tuple) to customize instance creation. It
is also commonly overridden in custom metaclasses in order to
customize class creation.
Stackoverflow’da konuyla ilgili başlıklardan biri:
Link
Linkteki yorumlardan bir alıntı:
Use __new__ when you need to control the creation of a new instance. Use __init__ when you need to control initialization of a new instance.new is the first step of instance creation. It’s called first, and is responsible for returning a new instance of your class. In contrast, init doesn’t return anything; it’s only responsible for initializing the instance after it’s been created.
In general, you shouldn’t need to override new unless you’re subclassing an immutable type like str, int, unicode or tuple.
Sanıyorum sys.stdout’u değiştirmeyi biliyorsunuz. Aşağıdaki fonksiyonları çalıştırarak yardım almak istediğim modül veya fonksiyon dökümanlarını text dosyasına yazdırıyorum. Böylece bir yandan dökümanı okurken diğer yandan öğrendiklerimle sıcağı sıcağına alıştırmalar yapıyorum.
Mesela bir modül hakkında bilgi almak istiyorsam aşağıdaki fonksiyonu kullanıyorum:
def extract_module_help(module):
import sys
with open("help_{}.txt".format(module), "w") as dosya:
mod = __import__("{}".format(module))
original = sys.stdout
sys.stdout = dosya
print(help(mod))
sys.stdout = original
#Örneğin:
extract_module_help("sys")
Bir fonksiyon hakkında bilgi almak istiyorsam da aşağıdaki fonksiyonu çalıştırıyorum:
def extract_function_help(function):
import sys
with open("help_{}.txt".format(function), "w") as dosya:
original = sys.stdout
sys.stdout = dosya
print(help(function))
sys.stdout = original
#Örneğin:
extract_function_help("sys.stdout")
Çok basit kodlar ama oldukça da işlevsel. Tekrar tekrar help() yazmaktan ve konsolu işgal etmekten iyi en azından.
Fırat Özgül’ün hazırladığı kaynakta NTP’nin son konusu olarak new metodu hakkında bilgiler Bölüm 44’de var.
Python’da bir sınıfın ömrü üç aşamadan oluşur: 1. İnşa (Construction) 2. İlklendirme (initialization) 3. Sonlandırma (destruction) Biz bundan önceki derslerimizde ilklendirme sürecinin nasıl yürüdüğünü görmüştük. Bu dersimizde ise, ilklendirme sürecine de tekrar değinmekle birlikte, özellikle inşa ve sonlandırma süreçlerini ele alacağız. Önceki derslerimizden de bildiğimiz gibi, Python’da bir sınıfı ilklendirmek için __init__() adlı bir metottan yararlanıyoruz. Ancak, adının aksine, ilklendirme, sınıfların oluşturulmasına ilişkin ilk basamak değildir. Python, bir sınıfın ilklendirilmesinden önce o sınıfı inşa eder. Bu inşa işleminden sorumlu metodun adı ise __new__() ‘dur. Gelin bu metodu yakından tanımaya çalışalım...