1.介绍一下property,他可以将一个方法转换为一个属性(注意属性和方法函数不要相同)
class fun(): @property def get_age(self): return self.age @get_age.setter def get_age(self,age): self.age=age t=fun() t.get_age=12#相当于调用t.get_age(12) print(t.get_age)#相当于调用了t.get_age #但是这里要注意这个调用顺序,只有有了age这个变量才能访问它
廖雪峰老师的解释 可以看一下这个网址,他肯定比我解释的好 ,但是我希望你们不要放弃我
在介绍一下property的另一种方法 廖老师没有讲到
class Person(): def fget(self): return self._name * 2 def fset(self, name): # 所有输入的姓名以大写形式保存\n", self._name = name.upper() def fdel(self): self._name = None name = property(fget, fset, fdel, "对name进行下下操作啦") t=Person() t.name='luojaijnyi' print(t.name) t.name1="xiaoyihao" print(t.name1)
这个里面与两个坑
1.就是在类里面name这个变量前面必须有一个下划线
2.就是它只是针对name这个变量有这样的操作 比如说name1就不行 ,但是也可以让name1拥有同样的功能
class Person(): def fget(self): return self._name * 2 def fset(self, name): # 所有输入的姓名以大写形式保存\n", self._name = name.upper() def fdel(self): self._name = None name = property(fget, fset, fdel, "对name进行下下操作啦") name1 = property(fget, fset, fdel, "对name进行下下操作啦") t=Person() t.name='luojaijnyi' print(t.name) t.name1="xiaoyihao" print(t.name1)
2.类的内置属性举例
class fun(): ''' 我是一个好孩子 ''' pass t=fun() print(fun.__name__) print(t.__dict__) print(fun.__bases__) print(t.__doc__)
3.介绍两个魔法函数(魔法函数就是像__init__ 那样在特定的时刻会自己调用)
# 类的常用常用魔法函数 class fun(): def __init__(self): print("在创建对象的时候会自动调用") def __str__(self): return "可以将对象当做字符串使用" def __call__(self): print("当对象被当做函数的时候触发") a=fun() a() print(a)
类里面有__str__这个函数,就可以把这个类的对象当成一个字符串来使用
类里面有__call__这个函数就可以将这个类的对象当成一个函数来使用
再来一个魔法函数 __getattr__ 这个函数是在对象没有这个属性的时候触发调用,记住是属性而不是成员方法,如果你使用一个未定义得 成员函数会直接报错
class A(): name = "NoName" age = 18 def __getattr__(self, name):#这个函数比较特殊 print("没找到呀没找到") print(name) a = A() print(a.name) print(a.addr)#a这个对象会作为第一个参数传给self addr会作为第二个参数传给参数列表中的name
注意到上面一段代码里面的最后面 print(a.adrr) 这段代码会触发魔法函数 __getattr__ 然后在这个函数里面没有返回值,然后你又print 他,结果里面会出现一个None,类似于下面的道理
def fun(): print("记住我这个函数没有返回值") print(fun())#因为没有返回值,所以会打印一个None