Python 高级编程和异步IO并发编程 --04_8 Python对象的自身机制dir/dict

Doris ·
更新时间:2024-11-13
· 541 次阅读

# python自省:通过一定的机制,查找到对象的内部结构 # java里面有private和protected,用于指向类里面受保护的方法,而python中没有该方法 class Date: # 构造函数 def __init__(self, year, month, day): # 实例方法,传入的第一个参数是实例 self.year = year # 实例变量year等于传进来的year self.month = month # 实例变量month等于传进来的month self.day = day # 实例变量day等于传进来的day def tomorrow(self): # 实例方法 self.day += 1 # self.day 是对象(实例)的变量; # 如果要定义类变量,则此处应该写Date.day = xxx @staticmethod # 静态方法,前面不接收self,也不需要接收class对象,这种函数的调用前面必须加Date,因为已经进入Date的命名空间 def parse_from_string(date_str): year, month, day = tuple(date_str.split("-")) return Date(int(year), int(month), int(day)) # 当类名不是Date,变成Date1,则此处的Date必需也跟着变成Date1,硬编码 @staticmethod # 静态方法的功能虽然可以被classmethod实现,但如果只是判断输入字符串是否合法 ,则不需要return,没必要用classmethod def valid_str(date_str): # 此处只是检查,不返回对象 year, month, day = tuple(date_str.split("-")) if (int(year) > 0 and int(month) > 0 and int(month) 0 and int(day) <= 31): return True else: return False @classmethod # 类方法,使用类方法/静态方法时,必须用装饰器 def from_string(cls, date_str): # 传入的第一个参数是类本身 year, month, day = tuple(date_str.split("-")) return cls(int(year), int(month), int(day)) # 由于传入的是类本身,就不用采用硬编码的方式去完成 def __str__(self): # 实例方法 return "{year}/{month}/{day}".format(year=self.year, month=self.month, day=self.day) class Person: name = "user" class Student(Person): # Student属于Person的子类 def __init__(self,school_name): self.school_name = school_name # 实例的属性初始化为school_name if __name__ == "__main__": user = Student("慕课网") # user是Student类的实例 # 通过__dict__查找属性:字典在python中是用c语言写的,性能很高 print(user.__dict__) # __dict__作用于对象user,就是对象user的变量 print(user.name) # name属于Person对象里面的值,并不属于Student的属性 C:\Users\Amber\PycharmProjects\test0\venv\Scripts\python.exe C:/Users/Amber/PycharmProjects/test0/Chapter03/self_ex.py {'school_name': '慕课网'} user # python自省:通过一定的机制,查找到对象的内部结构 # java里面有private和protected,用于指向类里面受保护的方法,而python中没有该方法 class Date: # 构造函数 def __init__(self, year, month, day): # 实例方法,传入的第一个参数是实例 self.year = year # 实例变量year等于传进来的year self.month = month # 实例变量month等于传进来的month self.day = day # 实例变量day等于传进来的day def tomorrow(self): # 实例方法 self.day += 1 # self.day 是对象(实例)的变量; # 如果要定义类变量,则此处应该写Date.day = xxx @staticmethod # 静态方法,前面不接收self,也不需要接收class对象,这种函数的调用前面必须加Date,因为已经进入Date的命名空间 def parse_from_string(date_str): year, month, day = tuple(date_str.split("-")) return Date(int(year), int(month), int(day)) # 当类名不是Date,变成Date1,则此处的Date必需也跟着变成Date1,硬编码 @staticmethod # 静态方法的功能虽然可以被classmethod实现,但如果只是判断输入字符串是否合法 ,则不需要return,没必要用classmethod def valid_str(date_str): # 此处只是检查,不返回对象 year, month, day = tuple(date_str.split("-")) if (int(year) > 0 and int(month) > 0 and int(month) 0 and int(day) <= 31): return True else: return False @classmethod # 类方法,使用类方法/静态方法时,必须用装饰器 def from_string(cls, date_str): # 传入的第一个参数是类本身 year, month, day = tuple(date_str.split("-")) return cls(int(year), int(month), int(day)) # 由于传入的是类本身,就不用采用硬编码的方式去完成 def __str__(self): # 实例方法 return "{year}/{month}/{day}".format(year=self.year, month=self.month, day=self.day) class Person: """ # 该注释部分会被魔法函数__doc__提取出来 人 """ name = "user" class Student(Person): # Student属于Person的子类 def __init__(self,school_name): self.school_name = school_name # 实例的属性初始化为school_name if __name__ == "__main__": user = Student("慕课网") # user是Student类的实例 # 通过__dict__查找属性:字典在python中是用c语言写的,性能很高 print(user.__dict__) # __dict__作用于对象user,就是对象user的变量,对于实例user,透过__dict__就可以获取属性 print(user.name) # name属于Person对象里面的值,并不属于Student的属性 print(Person.__dict__) # Persion是一个类,user是实例。类就比实例更加丰富,包括所属的model,main,dict,weakref,doc user.__dict__["school_addr"] = "北京市" # 完成动态操作user对象的过程,赋值 #print(dir(user)) C:\Users\Amber\PycharmProjects\test0\venv\Scripts\python.exe C:/Users/Amber/PycharmProjects/test0/Chapter03/self_ex.py {'school_name': '慕课网'} user {'__module__': '__main__', '__doc__': ' # 该注释部分会被魔法函数__doc__提取出来\n 人\n ', 'name': 'user', '__dict__': , '__weakref__': } Process finished with exit code 0

dir

# python自省:通过一定的机制,查找到对象的内部结构 # java里面有private和protected,用于指向类里面受保护的方法,而python中没有该方法 class Date: # 构造函数 def __init__(self, year, month, day): # 实例方法,传入的第一个参数是实例 self.year = year # 实例变量year等于传进来的year self.month = month # 实例变量month等于传进来的month self.day = day # 实例变量day等于传进来的day def tomorrow(self): # 实例方法 self.day += 1 # self.day 是对象(实例)的变量; # 如果要定义类变量,则此处应该写Date.day = xxx @staticmethod # 静态方法,前面不接收self,也不需要接收class对象,这种函数的调用前面必须加Date,因为已经进入Date的命名空间 def parse_from_string(date_str): year, month, day = tuple(date_str.split("-")) return Date(int(year), int(month), int(day)) # 当类名不是Date,变成Date1,则此处的Date必需也跟着变成Date1,硬编码 @staticmethod # 静态方法的功能虽然可以被classmethod实现,但如果只是判断输入字符串是否合法 ,则不需要return,没必要用classmethod def valid_str(date_str): # 此处只是检查,不返回对象 year, month, day = tuple(date_str.split("-")) if (int(year) > 0 and int(month) > 0 and int(month) 0 and int(day) <= 31): return True else: return False @classmethod # 类方法,使用类方法/静态方法时,必须用装饰器 def from_string(cls, date_str): # 传入的第一个参数是类本身 year, month, day = tuple(date_str.split("-")) return cls(int(year), int(month), int(day)) # 由于传入的是类本身,就不用采用硬编码的方式去完成 def __str__(self): # 实例方法 return "{year}/{month}/{day}".format(year=self.year, month=self.month, day=self.day) class Person: """ # 该注释部分会被魔法函数__doc__提取出来 人 """ name = "user" class Student(Person): # Student属于Person的子类 def __init__(self,school_name): self.school_name = school_name # 实例的属性初始化为school_name if __name__ == "__main__": user = Student("慕课网") # user是Student类的实例 # 通过__dict__查找属性:字典在python中是用c语言写的,性能很高 #print(user.__dict__) # __dict__作用于对象user,就是对象user的变量,对于实例user,透过__dict__就可以获取属性 #print(user.name) # name属于Person对象里面的值,并不属于Student的属性 #print(Person.__dict__) # Persion是一个类,user是实例。类就比实例更加丰富,包括所属的model,main,dict,weakref,doc #user.__dict__["school_addr"] = "北京市" # 完成动态操作user对象的过程,赋值 print(dir(user)) # dir(user)列出user对象的所有属性, dir属性比dict更强大。 C:\Users\Amber\PycharmProjects\test0\venv\Scripts\python.exe C:/Users/Amber/PycharmProjects/test0/Chapter03/self_ex.py ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'school_name'] Process finished with exit code 0

 

上面,对于list,dict会抛异常

list就有很多魔法函数。


作者:世界非世界,是名世界!



io 异步io Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号