类的绑定方法与property装饰器


一.类的绑定方法

 1 # 绑定给对象的
 2 class Student():
 3     def __init__(self, name, age, gender):
 4         self.name = name
 5         self.age = age
 6         self.gender = gender
 7 
 8     def tell_info(self):
 9         print('name:%s, age:%s,gender:%s' % (self.name, self.age, self.gender))
10 
11         stu = Student('ly', 18, 'male')
12         stu.tell_info()  # stu.tell_info(stu)
13 
14 
15 # 绑定给类的
16 class Mysql():
17     def __init__(self, ip, port):
18         self.ip = ip
19         self.port = port
20 
21     @classmethod
22     def from_conf(cls):
23         res = cls('100.233.122.234', 3306)
24         return res
25 
26 
27 print(Mysql.from_conf().__dict__)

二.非绑定方法

 1 class Student():
 2     school = 'shanghai'
 3 
 4     def __init__(self, name, age, gender):
 5         self.name = name
 6         self.age = age
 7         self.gender = gender
 8 
 9     @staticmethod
10     def create_id():
11         import uuid
12         return uuid.uuid4()
13 
14 
15 stu = Student('jason', 18, 'male')
16 print(Student.create_id().__dict__)
17 print(stu.create_id())

三.如何隐藏属性

 1 # 隐藏
 2 '''
 3     1. 在类定义阶段,发生了语法上的变形_类名__属性名
 4     2. 隐藏对外不对内
 5     3. 只有在类定义阶段发生变形,其他情况都不发生变形了
 6 
 7 为什么要隐藏: 类里面的隐藏属性, 类外部可以使用,但是目的不是让类外部使用的,类外部要是想用,在类内部开放接口进行访问
 8             可以达到对外部数据的严格控制
 9 '''
10 
11 
12 class Student():
13     __school = 'shanghai'
14 
15     def __init__(self, name, age):
16         self.name = name
17         self.age = age
18 
19     def __tell_info(self, name, age):
20         print('name:%s, age:%s' % (self.name, self.age))
21 
22 
23 def get_school(self):
24     return self.__school
25 
26 
27 def set_school(self, v):
28     if type(v) is not str:
29         print('数据类型不合法')
30         return
31 
32     self.__school = v
33 
34 
35 stu1 = Student('jason', 18)
36 # print(stu1.get_school())
37 print(Student.__dict__)
38 
39 print(stu1._Student__school)
40 print(stu1._Student__tell_info('jason', 18))
41 print(stu1.get_school())
42 stu1.set_school('jason')
43 print(stu1.get_school())

四.property装饰器

 1 class Student():
 2     __school = 'SH'  # _Student__school  => _类名__属性名
 3 
 4     def __init__(self, name, age):
 5         self.__name = name
 6         self.age = age
 7 
 8     def __tell_info(self):  # _Student__tell_info  => _类名__函数名
 9         print('name: %s, age: %s' % (self.__name, self.age))
10 
11     @property  # 把方法伪装成属性
12     def name(self):
13         return "name:%s" % self.__name
14 
15     @name.setter
16     def name(self, v):
17         if type(v) is not str:
18             print('数据类型不合法')
19         # if isinstance(v, str):
20             return
21         self.__name = v
22 
23     @name.deleter
24     def name(self):
25         print('不让删')
26 
27 stu = Student('ly', 18)
28 print(stu.get_name())
29 
30 stu.name = 123
31 print(stu.name)
32 
33 del stu.name
34 
35 
36 # 练习
37 class Bmi():
38     def __init__(self, height, weight):
39         self.height = height
40         self.weight = weight
41 
42     @property
43     def get_bmi(self):
44         return self.weight / (self.height ** 2)
45 
46 bmi = Bmi(1.8, 70)
47 print(bmi.get_bmi)
48 
49 
50 # 了解
51 
52 class Student():
53     __school = 'SH'  # _Student__school  => _类名__属性名
54 
55     def __init__(self, name, age):
56         self.__name = name
57         self.age = age
58 
59     def __tell_info(self):  # _Student__tell_info  => _类名__函数名
60         print('name: %s, age: %s' % (self.__name, self.age))
61 
62     def get_name(self):
63         return "name:%s" % self.__name
64 
65     def set_name(self, v):
66         if type(v) is not str:
67             print('数据类型不合法')
68             # if isinstance(v, str):
69             return
70         self.__name = v
71 
72     def del_name(self):
73         print('不让删')
74     
75 # 了解
76 name = property(get_name, set_name, del_name)
77 
78 
79 stu = Student('ly', 18)
80 print(stu.xxx)
81 
82 stu.name = 'aaa'
83 print(stu.name)

相关