8. 类的成员描述符(属性)
- 类的成员描述是为了在类中对类的成员属性进行相关操作而创建的一种方式
- get:获取属性的操作
- set:修改或添加属性操作
- delete:删除属性的操作
- 如果想使用类的额成员描述符,大概有三种方法
- 使用类实现描述器
- 使用属性修饰符
- 使用property函数
- property函数很简单
- property(fget, fset, fdel, doc)
- 无论哪种修饰符都是为了对成员属性进行相应的控制
- 类的方式:适用多个类中的多个属性共用同一个描述符
- property:适用当前类中使用,可以控制一个类中多个属性
- 属性修饰符:适用于当前类中使用,控制一个类中的一个属性
9. 类的内置属性
__dict__: 以字典的方式显示类的成员组成
__doc__: 获取类的文档信息
__name__: 获取类的名称,如果在模块中使用,获取模块的名称
__bases__: 获取某个类的所有父类,以元组的方式显示
10. 类的常用魔术方法
- 魔术方法就是不需要人为调用的方法,基本是在特定的时间自动触发
- 魔术方法的统一特征,方法名被前后各两个下划线包裹
- 操作类
__init__
:构造函数
__new__
:对象实例化方法,此魔术方法较特殊,一般不需要使用
__call__
:对象当函数使用的时候触发
__str__
:当对象被当作字符串使用的时候
__repr__
:返回字符串
- 描述符相关
__set__
__get__
__delete__
- 属性操作相关
__getattr__
:访问一个不存在的属性时触发
__setattr__
:对成员属性进行设置的时候触发
- 参数:
- self用来获取当前对象
- 被设置的属性名称,以字符串形式出现
- 需要对属性名称设置的值
- 作用:进行属性设置的时候进行验证或者修改
- 注意:在该方法中不能对属性进行赋值操作,否则死循环
- 运算类相关魔术方法
__gt__
:进行大于判断的时候触发的函数
- 参数
- self
- 第二个参数是第二个对象
- 返回值可以是任意值,推荐返回布尔值
11. 类和对象的三种方法
- 实例方法
- 需要实例化对象才能使用的方法,使用过程中可能需要截至对象的其他对象的方法完成
- 静态方法
- 类方法
class Student():
def __init__(self, name, age):
self.name = name
self.age = age
self.setName(name)
def intro(self):
print("Hai, my name is {0}".format(self.name))
def setName(self, name):
self.name = name.upper()
s1 = Student("RUO Chen", 19.8)
s2 = Student("michi stangle", 24.0)
s1.intro()
s2.intro()
Hai, my name is RUO CHEN
Hai, my name is MICHI STANGLE
class Person():
'''
这是一个人,一个高尚的人,一个脱离了低俗趣味的人
他还他妈的有属性
'''
def fget(self):
return self._name * 2
def fset(self, name):
self.name = name.upper()
def fdel(self):
self._name = "NoName"
name = property(fget, fset, fdel, "对name进行操作")
print(Person.__dict__)
print(Person.__doc__)
print(Person.__name__)
print(Person.__bases__)
{'__module__': '__main__', '__doc__': '\n 这是一个人,一个高尚的人,一个脱离了低俗趣味的人\n 他还他妈的有属性\n ', 'fget': <function Person.fget at 0x000001FBBD3AFBF8>, 'fset': <function Person.fset at 0x000001FBBD3AF9D8>, 'fdel': <function Person.fdel at 0x000001FBBD3AF8C8>, 'name': <property object at 0x000001FBBD3B7BD8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>}
这是一个人,一个高尚的人,一个脱离了低俗趣味的人
他还他妈的有属性
Person
(<class 'object'>,)
class A():
def __init__(self, name = 0):
print("哈哈,我被调用了")
a = A()
哈哈,我被调用了
class A():
def __init__(self, name = 0):
print("哈哈,我被调用了")
def __call__(self):
print("我被调用again")
a = A()
a()
哈哈,我被调用了
我被调用again
class A():
def __init__(self, name = 0):
print("哈哈,我被调用了")
def __call__(self):
print("我被调用again")
def __str__(self):
return '666'
a = A()
print(a)
哈哈,我被调用了
666
class A():
name = "NoName"
age = 18
def __getattr__(self, name):
print("没找到")
print(name)
a = A()
print(a.name)
print(a.addr)
NoName
没找到
addr
None
class Person():
def __init__(self):
pass
def __setattr__(self, name, value):
print("设置属性:{0}".format(name))
super().__setattr__(name, value)
p = Person()
print(p.__dict__)
p.age = 18
{}
设置属性:age
class Student():
def __init__(self, name):
self._name = name
def __gt__(self, obj):
print("哈哈,{0} 会比 {1} 大吗?".format(self, obj))
return self._name > obj._name
stu1 = Student("one")
stu2 = Student("two")
print(stu1 > stu2)
哈哈,<__main__.Student object at 0x000001C15772EB38> 会比 <__main__.Student object at 0x000001C15772E550> 大吗?
False
class Person():
def eat(self):
print(self)
print("Eating......")
@classmethod
def play(cls):
print(cls)
print("Playing......")
@staticmethod
def say():
print("Saying......")
yueyue = Person()
yueyue.eat()
Person.play()
yueyue.play()
Person.say()
yueyue.say()
<__main__.Person object at 0x000001C157766710>
Eating......
<class '__main__.Person'>
Playing......
<class '__main__.Person'>
Playing......
Saying......
Saying......
(完)