2016-04-07 19 views
0

Bir nesneyi dinamik olarak bir sınıftan oluşturmam gereken bir proje üzerinde çalışıyorum. Kimsenin çözmesini istemiyorum ama sadece doğru yöne doğrult. Köpekler ile çalışıyor olsaydım bir örnek olurdu.Bir işlev çağırarak bir sınıftan nesne oluşturmaya çalışmak

class Dog(object): 
    """Creating Dogs""" 
    def __init__(self, name, age, gender): 
     super(Dog, self).__init__() 
     self.name = name 
     self.name = age 
     self.name = gender 

Bu bilgiyi global bir nesne oluşturacak şekilde iletebileceğim bir işleve sahip olmak isterim. Yani teorik olarak ben işleve adı "Jack" geçtiyseniz

def create_dog(name, age, gender): 
    name = Dog(name,age, gender) 
    return(name) 

Bir nesne global sınıftan "Jack" adlı olurdu: function şu şekilde görünecektir. Sadece bunu yapmak için iyi bir yol bulmaya çalışıyorum. Bu tamamen python'a karşıysa, başka bir yol bulacağım ama burada oturuyorum. Sınıfı fonksiyonumun içine yerleştirmeyi de düşündüm ama isim alanı küreselleşmeyecek.

+0

Bir grup küresel nesneye sahip olmanın bir nedeni var mı? Genel olarak mümkün olduğunda genel nesnelerden kaçınmak en iyisidir çünkü kod hata ayıklaması çok zor olabilir. – mxdg

+1

İstediğinizden emin değilsiniz, ancak [Python'da değişken değişkenleri nasıl yapabilirim?] (Http://stackoverflow.com/q/1373164/953482). Kısa versiyon: 'scope' sözcüğü olan global kapsamda bir değişken oluşturan 'create_dog (" Jack ", 5," male ") işlevine sahip olmak neredeyse hiç de iyi bir fikir değildir. – Kevin

cevap

0

erişin: (ki hala kötüyse, ama globals)

def create_dog(name, age, gender, locals_=locals()): 
    dog = Dog(name, age, gender) 
    locals_[name] = dog 


create_dog("jack", 3, "male") 
print(jack) 
+0

Bu konuya daha iyi eğilmeye başladım ve aynı zamanda daha temiz ve kendiliğinden isim alanları arasında "sızıntı" ile uğraşmak zorunda kalmaya başladım. – kaceymusgraves

0

Belki de alternatif bir kurucu yapmak istersiniz?

class Dog(object): 
    """Creating Dogs""" 
    def __init__(self, name, age, gender): 
     super(Dog, self).__init__() 
     self.name = name 
     self.name = age 
     self.name = gender 


    @classmethod 
    def create_dog(name, age, gender): 
     name = Dog(name,age, gender) 
     return name 

da tartışmaya bakınız Meaning of @classmethod and @staticmethod for beginner?

tek bir dosya komut dosyası kullanır, ancak daha karmaşık bir yazılım için tüm 3 unsurları ithal etmek gerekecek eğer küresel bir sözlüğü gayet:

from dogs import dogs, create_dog, Dog 

Sınıf özelliği ile yalnızca bir ad alanı içe aktarırsınız. Yani yapabilirsiniz: Şimdi

class Dog(object): 
    """Creating Dogs""" 

    members = [] 

    def __init__(self, name, age, gender): 
     super(Dog, self).__init__() 
     self.name = name 
     self.name = age 
     self.name = gender 


    @classmethod 
    def create_dog(name, age, gender): 
     name = Dog(name,age, gender) 
     Dog.members.append(name) 
     return name 

Eğer import Dog basitçe can ve yerli değişen küresel sözlüğü

dogs = {} 

def create_dog(name, age, gender): 
    # maybe check if already exists 
    dogs[name] = Dog(name, age, gender) 
+0

Teşekkürler Oz. Bu konuda kesinlikle daha fazla okuyacağım. Bu örnek için sözlüğe doğru eğilmeyi düşünüyorum, ama bu soruya birkaç kez rastladım. – kaceymusgraves

+0

sınıfını güncellemek için yapıcıyı değiştirebilir ve sınıf niteliğinden ziyade global bir değişkeniniz yoktur. – Oz123

0

yaratabilecek class özelliği Dog.members

+0

İpucu için teşekkür ederim efendim. – kaceymusgraves