#property 实例classPerson():deffgetname(self):return self._name, self._age
deffgetage(self):return self._age
deffsetname(self,name):
self._name= name.upper()deffsetage(self,age):
self._age =abs(int(age))deffdelname(self):
self._name='Noname'
name =property(fgetname, fsetname, fdelname,"change name to upper")
age =property(fgetage, fsetage)
p = Person()
p.name ="abby hua"
p.age =20.34334print(p.name)print(p.age)'''
输出结果:
ABBY HUA
20
'''
无论哪种修饰符,都是为了对成员属性进行相应的控制
类的方式: 适合多个类中的多个属性共用一个描述符
property: 适用当前类中使用,可以控制一个类中多个属性
属性修饰符: 适用当前类中使用,控制一个类中的一个属性
类的内置属性
__dict__: 以字典的方式显示类的成员组成
__doc__: 获取类的文档信息
__name__: 获取类的名称,如果在模块中使用,获取模块的名称
__bases__: 以元组方式显示类所有父类
#类的内置属性举例print(Person.__dict__)print(Person.__doc__)print(Person.__name__)print(Person.__bases__)'''
输出结果:
{'__module__': '__main__', '__doc__': '\n 这是一个person的说明文档\n ', 'fgetname': <function Person.fgetname at 0x00000000028087B8>, 'fgetage': <function Person.fgetage at 0x0000000002808AE8>, 'fsetname': <function Person.fsetname at 0x0000000002808B70>, 'fsetage': <function Person.fsetage at 0x0000000002808BF8>, 'fdelname': <function Person.fdelname at 0x0000000002808C80>, 'name': <property object at 0x000000000206C868>, 'age': <property object at 0x0000000002811818>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>}
这是一个person的说明文档
Person
(<class 'object'>,)
'''
类的常用魔术方法
魔术方法就是不需要人为调用的方法,基本是在特定的时刻自动触发。
魔术方法有统一特征,方法名被前后两个下划线包裹
操作类
__init__: 构造函数
__new__: 对象实例化方法,此函数较特殊,一般不需要使用
__call__: 对象当函数使用的时候触发
# 魔术方法__call__实例classAnimal():def__init__(self):print("I am in __init__ method")def__call__(self):print("I am in __call__ method")
a = Animal()
a()'''
I am in __init__ method
I am in __call__ method
'''
- `__str__` :当对象被当做字符串使用的时候触发
#魔术方法__str__实例classDog():'''
def __str__(self):
return "I am in __str__ method"
'''
d = Dog()print(d)'''
输出结果:
I am in __str__ method
不定义__str__时,输出结果为: <__main__.Dog object at 0x00000000027EEF60>
'''
#魔术方法__str__和__repr__区别classDate():def__init__(self, time):
self.time = time
#输出结果不带引号def__str__(self):print("I am in Date __str__ method")print("date name is %s "% self.time)return self.time
'''
输出结果:
I am in Date __str__ method
date name is 2019/10/30
2019/10/30
'''#输出结果带引号,而且可以直接通过eval()函数调用def__repr__(self):print("I am in Date __repr__ method")print("date name is %r"% self.time)return self.time
'''
输出结果:
I am in Date __repr__ method
date name is '2019/10/30'
2019/10/30
'''
today ="2019"
d = Date(today)#__str__和__repr__都定义时,默认只调用__str__, 只有当__str__没有定义, 才会调用__repr__print(d)
描述符相关
__set__
__get__
__delete__
属性操作相关
__getattr__ : 访问一个不存在的属性时触发
# 魔法方法__getattr__实例classStudent():def__init__(self, name):
self.name = name
def__getattr__(self, name):print("attribute %s not exist"% name)
s = Student("abby")print(s.name)#没有定义__getattr__时,调用不存在的成员,输出AttributeError: 'Student' object has no attribute 'age'print(s.age)'''
输出结果:
abby
attribute age not exist
None
'''
#魔法方法__setattr__实例classTeacher():def__init__(self, name, value):print("I am in __init__ method start")
self.name = value
print("I am in __init__ method end")def__setattr__(self, name, value):print("I am in __setattr__ method start")super().__setattr__(name, value)print("I am in __setattr__ method end")
t = Teacher("name","Miss Tang")'''
输出结果:
I am in __init__ method start
I am in __setattr__ method start
I am in __setattr__ method end
I am in __init__ method end
'''
#抽象方法实例classAnimal():defsayHello(self):passclassDog(Animal):defsayHello(self):print("闻一下呗")classPerson(Animal):defsayHello(self):print("Have a hug")
d = Dog()
d.sayHello()
p = Person()
p.sayHello()'''
输出结果:
闻一下呗
Have a hug
'''
#自己组装类实例classA():passdefsayHello(self):print("Hello......")classB():defsayHello(self):print("Hello......")
sayHello(6)#方法可以像属性一样赋值
A.sayHello = sayHello
a = A()
a.sayHello()#上面通过赋值组装的类和class B的用法一样
b = B()
b.sayHello()'''
输出结果:
Hello......
Hello......
Hello......
'''
- 通过类实例组装, 可以借助MethodType实现
#自己组装类实例2#通过类实例组装from types import MethodType
classC():passdefsayBye(self):print("Bye......")
c = C()
c.sayBye = MethodType(sayBye, C)
c.sayBye()'''
输出结果:
Bye......
'''
- 借助于type实现
#自己组装类实例3#借助type实现defsayHi(self):print("say Hi......")defsayGoodBye(self):print("say Goodbye ......")
D =type("DName",(object,),{"class_hi": sayHi,"class_goodbye": sayGoodBye})
d = D()
d.class_hi()
d.class_goodbye()'''
输出结果:
say Hi......
say Goodbye ......
'''