إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

Using Properties in Python

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • Mohammed AL Jeaid
    رد
    المشاركة الأصلية بواسطة Mutati0N مشاهدة المشاركة
    مقـال جـامد يا ابو حميـد
    شكـرا ليك
    TOP *****

    اترك تعليق:


  • كريم عبد المجيد
    رد
    مقـال جـامد يا ابو حميـد
    شكـرا ليك

    اترك تعليق:


  • StrikerX
    كتب موضوع Using Properties in Python

    Using Properties in Python

    Properties in Python

    ال Properties مفهومها موجود فى العديد من اللغات مثل ال C#.NET /VB.NET وكذلك ال python وفى لغات اخرى بتستخدم Getters/Setters methods مثل ال Java مثلا
    ال Properties نفسها بتستخدم Getters/Setters ولكن بإسلوب الطف ، يعنى بدل ماتحفظ 2 method عشان تستخدمها هى Property واحدة بتستخدم ك get/set


    لاحظ بدون إستخدام ال Properties او ال getters/setters انك تقدر تتعامل مباشرة مع ال Fields ودا شئ خطير ، لاحظ التالى
    كود:
    >>> class Person(object):
    
    	def __init__(self, name, sex, age):
    		self.name=name
    		self.sex=sex
    		self.age=age
    
    		
    >>> p1=Person('Ahmed', 'M', 18)
    
    >>> p1.name
    'Ahmed'
    >>> p1.sex
    'M'
    >>> p1.age
    18
    >>> p1.name="RULES"
    >>> p1.name
    'RULES'
    >>> p1.age=2
    >>> p1.age
    2
    هنا نقدر نسند string ل age ودا شئ مش تمام لأنه المفروض مش ياخد غير int وتقدر تسند قيمة غير منطقية لل age مثلا 100000 سنة !
    كود:
    >>> p1.age="WHATEVER"
    >>> p1.age
    'WHATEVER'
    فعشان نتغلب على المشكلة دا لازم نعمل check وذلك بإستخدام getter/setter لكل field + نمنع الأكسس المباشر ليه فهنعمله private مش حد يقدر يوصله غير ال methods اللى داخل ال class نفسها فهنسبق إسم اى field ب 2 underscores
    كود:
    class Person(object):
    
    	def __init__(self, name, sex, age):
    		self.__name=name
    		self.__sex=sex
    		self.__age=age
    	#getter/setter for name	
    	def get_name(self):
    		return self.__name
    	def set_name(self, new_name):
    		assert type(new_name) == str
    		self.__name=new_name
    
    	#getter/setter for sex
    	def get_sex(self):
                return self.__sex
            def set_sex(self, new_sex):
                assert type(new_sex)==str
                self.__sex=new_sex
                
            #getter/setter for age
            def get_age(self):
                return self.__age
    
            def set_age(self, new_age):
                assert type(new_age)==int
                self.__age=new_age
    لاحظ التالى:
    كود:
    >>> p=Person('Ahmed', 'M', 19)
    >>> p
    <__main__.Person object at 0x00CEA530>
    >>> p.name
    
    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
        p.name
    AttributeError: 'Person' object has no attribute 'name'
    >>> p.get_name()
    'Ahmed'
    >>> p.set_name("RULES")
    >>> p.get_name()
    'RULES'
    لاحظ عند محاولتنا إسناد str لل Field age هيدينا AssertionError وهيمنع الإستمرار !
    كود:
    >>> p.set_age('19') #Assign age field to a string -> AssertionError!
    
    Traceback (most recent call last):
      File "<pyshell#10>", line 1, in <module>
        p.set_age('19') #Assign age field to a string -> AssertionError!
      File "<pyshell#2>", line 26, in set_age
        assert type(new_age)==int
    AssertionError
    >>> p.set_age(31)
    >>> p.get_age()
    31
    لحد الآن هو دا افضل اسلوب ولكن هل هتضطر احفظ 2 method لكل field عشان استخدمه ؟؟
    JAVA قالت آه إستخدم 2 method عشان كل field ، لكن لغات تانية زى C#.NET /Python قالو لأ إستخدم Properties وهى مشابهه لل Field ولكن بشروط ال getters/setters

    وهنا نيجى للى إحنا محتاجينه
    كود:
    class Person(object):
        #Constructor
        def __init__(self, name, sex, age):
            #Initializing fields
            self.__name=name
            self.__age=age
            self.__sex=sex
    
        #Private Getters
        def __get_name(self):
            return self.__name
    
        def __get_sex(self):
            return self.__sex
    
        def __get_age(self):
            return self.__age
    
        #Private Setters
        def __set_name(self, new_name):
            assert type(new_name)==str
            self.__name=new_name
    
        def __set_sex(self, new_sex):
            assert type(new_sex)==str
            self.__sex=new_sex
    
        def __set_age(self, new_age):
            assert type(new_age)==int
            self.__age=new_age
    لحد الوقتى مش فى فرق عن ال مثال السابق غير إن ال setters/getters بقو private لأن سبقهم 2 underscores زى مانتو شايفين فكدا مش هنقدر نتعامل معاهم بصورة مباشرة :S

    بكل بساطة دا اللى إحنا عايزينه لأننا هنعمل Properties نستخدمها ولكن بالشروط اللى حددناها فى ال getters/setters
    كود:
        #Properties
        Name=property(fget=__get_name, fset=__set_name)
        Sex=property(fget=__get_sex, fset=__set_sex)
        Age=property(fget=__get_age, fset=__set_age)
    property هى type بيشمل عدة اشياء اللى يهمنا منها fget, fset
    وليكن إننا عملنا Object بإسم p1 كالتالى
    كود:
    p1=Person('Ahmed', 'M', 18)
        print p1.Name
    كأننا إستخدمنا
    كود:
    p1.get_name()
    كود:
        p1.Name='YOUSSEF
    '
    كأننا إستخدمنا
    كود:
    p1.set_name('YOUSSEF')
    كود:
        print p1.Name
    
        print p1.Age
    هنا حاولنا نعمل p1.set_age('Whatever') واحنا محددين ب assert ان لازم يكون ال type الخاص بال argument اللى هتتباصى لل set_age يكون من النوع int !
    كود:
    p1.Age="WHATEVER" #AssertionError
        print p1.age
    ال Class بصورته النهائية
    كود:
    class Person(object):
        #Constructor
        def __init__(self, name, sex, age):
            #Initializing fields
            self.__name=name
            self.__age=age
            self.__sex=sex
    
        #Private Getters
        def __get_name(self):
            return self.__name
    
        def __get_sex(self):
            return self.__sex
    
        def __get_age(self):
            return self.__age
    
        #Private Setters
        def __set_name(self, new_name):
            assert type(new_name)==str
            self.__name=new_name
    
        def __set_sex(self, new_sex):
            assert type(new_sex)==str
            self.__sex=new_sex
    
        def __set_age(self, new_age):
            assert type(new_age)==int
            self.__age=new_age
    
        #Properties
        Name=property(fget=__get_name, fset=__set_name)
        Sex=property(fget=__get_sex, fset=__set_sex)
        Age=property(fget=__get_age, fset=__set_age)
    
    if __name__=="__main__":
        p1=Person('Ahmed', 'M', 18)
        print p1.Name
        p1.Name='YOUSSEF'
        print p1.Name
    
        print p1.Age
        p1.Age="WHATEVER" #AssertionError
        print p1.age
يعمل...
X