类与对象

Python中类和对象的所有属性可以通过dir函数查看,dir() 函数用于列出对象的所有属性和方法。当你调用 dir(obj) 时,它会返回对象 obj 所有可以访问的属性、方法和特殊属性的列表,包括类属性

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',  '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

值得一提的是 · dict 用于管理

slot属性

slot = [ 'a']

类方法和静态方法

@classmethod def func(cls): print(cls)

类的表示

  • str
  • repr str的代偿是repr,反之不是

切片、索引、迭代

切片、索引迭代实际上是调用slice函数,slice函数最终调用getitem和setitem函数

a = [1,2,3,4,5,6,7,8]
a[1:4] = a[slice(1,4,None)]或者a[slice(1,4)]
a[1:6:2] = a[slice(1,6,2)]

当你定义了下面的函数后就支持索引了

  • getitem(self,index)
  • setitem(self,index,value)

类的属性访问

  • getattribute(self,name)
  • getattr(self,name)
  • setattr(self,name,value)
  • delattr(self,name)

访问属性调用的首先调用getattribute,grattr是getattribute的代偿

类的对象访问

  • get(self,instance,owner)
  • set(self,instance,value)
  • delete(self,instance)

[info] 注意 get和__getattrbute的区别是,前者访问整个对象或者类,后者访问对象或者类的属性

描述符

定义了getattrsetattrdelattr三个函数之一的类被称为描述符,描述符的作用是拦截类的属性的访问、修改、删除,但是对实例对象的访问无效

property描述符

一个简单的property的定义如下

class MyProperty:
    def __init__(self,fget=None,fset=None,fdel=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
    def __get__(self,instance,owner):
        return self.fget(instance)
    def __set__(self,instance,value):
        return self.fset(instance,value)
    def __delete__(self,instance):
        return self.fdel(instance)
    def __setter(self,fset):
        self.fset = fset
    def __deleter(self,fdel):
        self.fdel = fdel

用法如下

class c:
    def __init__(self):
        self._x = 1
    def fget(self):
        return self._x
    def fset(self,value):
        self._x = value
    def fdel(slef):
        del self._x
    x = MyProperty(fget,fset,fdel)

class c:
    def __init__(self):
        self._x = 1
    @MyProperty
    def x(self):
        return self._x
    @x.setter
    def x(self,value):
        self._x = value
    @x.deleter
    def x(self):
        del self._x
其中
@MyProperty
    def x(self):
        return self._x
等同于
def fget(self):
        return self._x
x = MyProperty(fget)

数据描述符与非数据描述符

当访问一个的属性时,访问的顺序是:数据描述符、对象属性(dict)、非数据描述符、类属性(MRO原则查找继承关系属性)

  • 只定义getattr被称为,非数据描述符
  • 定义了getattr与后两者的其中至少一个被称为数据描述符
class A:
    def __get__(self,instance,owner):
        print("get")
class B:
    b = A()
B.b
get
B.b = 1
B.b
1
class A:
    def __get__(self,instance,owner):
        print("get")
    def __set__(self,instance,value):
        print("set)
class B:
    b = A()
B.b
get
B.b = 1
B.b
set

set_name(self,owner,name):可以解决绑定属性名的传递问题,比如下面的函数中x=c(),执行init后会自动执行set_name并且将x作为name,d作为owner传递进去,实现类和实例名字的绑定

class c:
    def __set_name__(self,owner,name):
        self.name = name
        self.owner = owner
class d:
    x = c()

results matching ""

    No results matching ""

    results matching ""

      No results matching ""