类的基本属性/方法

一、python中内置特殊属性

  • 1、类/对象.__doc__类的文档
  • 2、类.__name__类的名字
  • 3、类.__base__类的第一个父类
  • 4、类.__bases__类的父类集合
  • 5、对象.__dict__构造函数
  • 6、类.__dict__类字典属性
  • 7、类.__module__类所在的模块
  • 8、类.__class__实例对应的类

二、python类中特殊的方法

  • 1、__str__(self)直接打印类的实例化对象的时候显示的

    f = Foo()
    print(f)
    # 不写这个方法返回的时候是
    <__main__.Foo object at 0x10c700a90>
    
    # 在类中加上
    ...
    def __str__(self):
        return 'hello'
    ...
    # 打印返回的是hello
    
  • 2、__init__(self)构造函数,实例化的时候传递参数、初始化就调用的函数、类的继承

  • 3、__repr__(self)这个和__str__函数一样的的使用,只是repr是显示给开发人员用的,str是显示给用户用的,一般我们使用的格式会是下面

    class Test1(object):
        def __init__(self):
            pass
    
        def __str__(self):
            return "hello"
    
        __repr__ = __str__
    
        ....
    
  • 4、__lt__(self)、__gt__(self)、__eg__(self)排序

    class Test1(object):
        def __init__(self, name, score):
            self.name = name
            self.score = score
    
        def __str__(self):
            return '(%s:%s)' % (self.name, self.score)
    
        __repr__ = __str__
    
        def __lt__(self, other):
            return self.score < other.score
    
        def __gt__(self, other):
            return self.score > other.score
    
        def __eg__(self, other):
            return self.score == other.score
    
    if __name__ == "__main__":
        test1 = [Test1('Tim', 69), Test1('Bob', 88), Test1('Alice', 77)]
        print(sorted(test1))
        # [(Tim:69), (Alice:77), (Bob:88)]
    
  • 5、__len__计算长度

    class Test2(object):
        def __init__(self, *args):
            self.name = args
    
        def __len__(self):
            return len(self.name)
    
    if __name__ == "__main__":
        test2 = Test2('哈哈', 20, '男')
        print(len(test2))
    
  • 6、__call__一个类实例也可以变成一个可调用对象

    class Test1(object):
        def __init__(self):
            pass
    
        def __call__(self, *args, **kwargs):
            print(args)
            print(kwargs)
    
    if __name__ == "__main__":
        test1 = Test1()
        test1('hello')
    
  • 7、__slots__用来限制__init__里面的只能添加的属性

    class Test(object):
        __slots__ = ('name', 'age', 'gender')
    
        def __init__(self, name, age, gender):
            self.name = name
            self.age = age
            self.gender = gender
    

三、静态方法

  • 1、被@staticmethod装饰器装饰的方法叫静态方法
  • 2、静态方法中不能直接使用self
  • 3、如果静态方法要使用self调用的时候就要把实例的对象作为静态方法的参数传递进去

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        @staticmethod
        def eat(self):
            print("%s is eating" % self.name)
    
        @staticmethod
        def sleep():
            print('在睡觉')
    
    if __name__ == "__main__":
        dog = Dog('哈哈')
        dog.eat(dog)
        dog.sleep()
    

四、类方法

  • 1、使用装饰器@classmethod装饰的方法叫类方法
  • 2、类方法直接使用类来调用
  • 3、类方法不能访问实例属性

    class Dog(object):
        name = '嘻嘻'
    
        def __init__(self, name):
            self.name = name
    
        @classmethod
        def eat(cls):
            print("%s is eating" % cls.name)
    
        @classmethod
        def sleep(cls):
            print('%s在睡觉' % cls.name)
    
    if __name__ == "__main__":
        dog = Dog('哈哈')
        dog.eat()
        Dog('呵呵').sleep()
    
  • 4、使用类方法连接数据库(scrapy中就会这样使用)

    from day11.lib import settings
    
    class MySQl(object):
        def __init__(self, host, port):
            self.host = host
            self.port = port
    
        @classmethod
        def from_conf(cls):
            return cls(settings.HOST, settings.PORT)
    

五、属性方法

  • 1、使用@property装饰器装饰的方法叫属性方法
  • 2、使用了@property装饰的方法,会改变该方法的属性由方法变成属性

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        @property
        def eat(self):
            print(" %s is eating" % self.name)
    
    if __name__ == "__main__":
        d = Dog('哈哈')
        d.eat
    
  • 3、属性方法的赋值

    class Dog(object):
        __food = '包子'
    
        def __init__(self, name):
            self.name = name
    
        @property
        def eat(self):
            return " %s is eating" % self.__food
    
        @eat.setter
        def eat(self, agr):
            self.__food = agr
    
    if __name__ == "__main__":
        d = Dog('哈哈')
        print(d.eat)
        d.eat = '嘻嘻'
        print(d.eat)
    
  • 4、属性方法的删除

    class Dog(object):
        __food = '包子'
    
        def __init__(self, name):
            self.name = name
    
        @property
        def eat(self):
            return " %s is eating" % self.__food
    
        @eat.setter
        def eat(self, agr):
            self.__food = agr
    
        @eat.deleter
        def eat(self):
            del self.__food
            print('已经删除')
    
    if __name__ == "__main__":
        d = Dog('哈哈')
        print(d.eat)
        d.eat = '嘻嘻'
        print(d.eat)
        del d.eat
        print(d.eat, '////')
    

六、判断对象是否为类的实例

  • 1、isinstance(对象, 类)用来判断一个对象是否为类的实例(包括继承的类)
  • 2、issubclass(子类, 父类)用来判断一个类是否为另外一个类的子类
  • 3、代码演示

      class Foo(object):
              pass
    
      class Bar(Foo):
              pass
    
      if __name__ == "__main__":
              foo = Foo()
              bar = Bar()
              print(isinstance(foo, Foo))
              print(isinstance(bar, Bar))
              print(issubclass(Bar, Foo))
              print(issubclass(Foo, object))
    

results matching ""

    No results matching ""