# 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就有很多魔法函数。
作者:世界非世界,是名世界!