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 ودا شئ خطير ، لاحظ التالى
هنا نقدر نسند string ل age ودا شئ مش تمام لأنه المفروض مش ياخد غير int وتقدر تسند قيمة غير منطقية لل age مثلا 100000 سنة !
فعشان نتغلب على المشكلة دا لازم نعمل check وذلك بإستخدام getter/setter لكل field + نمنع الأكسس المباشر ليه فهنعمله private مش حد يقدر يوصله غير ال methods اللى داخل ال class نفسها فهنسبق إسم اى field ب 2 underscores
لاحظ التالى:
لاحظ عند محاولتنا إسناد str لل Field age هيدينا AssertionError وهيمنع الإستمرار !
لحد الآن هو دا افضل اسلوب ولكن هل هتضطر احفظ 2 method لكل field عشان استخدمه ؟؟
JAVA قالت آه إستخدم 2 method عشان كل field ، لكن لغات تانية زى C#.NET /Python قالو لأ إستخدم Properties وهى مشابهه لل Field ولكن بشروط ال getters/setters
وهنا نيجى للى إحنا محتاجينه
لحد الوقتى مش فى فرق عن ال مثال السابق غير إن ال setters/getters بقو private لأن سبقهم 2 underscores زى مانتو شايفين فكدا مش هنقدر نتعامل معاهم بصورة مباشرة :S
بكل بساطة دا اللى إحنا عايزينه لأننا هنعمل Properties نستخدمها ولكن بالشروط اللى حددناها فى ال getters/setters
property هى type بيشمل عدة اشياء اللى يهمنا منها fget, fset
وليكن إننا عملنا Object بإسم p1 كالتالى
كأننا إستخدمنا
'
كأننا إستخدمنا
هنا حاولنا نعمل p1.set_age('Whatever') واحنا محددين ب assert ان لازم يكون ال type الخاص بال argument اللى هتتباصى لل set_age يكون من النوع int !
ال Class بصورته النهائية
ال 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
كود:
>>> p1.age="WHATEVER" >>> p1.age 'WHATEVER'
كود:
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'
كود:
>>> 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
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
بكل بساطة دا اللى إحنا عايزينه لأننا هنعمل 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)
وليكن إننا عملنا 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.Age="WHATEVER" #AssertionError print p1.age
كود:
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
تعليق