类的基本属性/方法
一、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))