python dir函数 dict方法 isinstance 类对象 类属性 类方法 静态方法 call方法 str方法 MRO函数 super() 多态 特殊方法 运算符方法 运算符的重载 特殊属性
2019-06-25 16:14
651 查看
版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
**
1,dir()函数可以获得对象的 所有 属性和方法 包含自定义的属性和方法
**
class Person: def test1(self): print("来呀快活呀") def test2(self): print("一边玩去") n = object() # object基类创建的对象 i = Person() # Person类创建的对象 print(dir(n)) print(dir(i))
运行结果如下
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'test1', 'test2']
以上可以看出:test1 和 test2 方法显示在第二行的打印结果里面
test1和test2虽然定义的是方法,实际上方法也是属性,只不过属性的类型是"method" say_age<class “method” >
**
2,‘obj__dict__’ 只获取自定义的一些属性
**
class Person: def __init__(self, name, age): self.name = name self.age = age def test1(self): print("来呀快活呀") def test2(self): print("滚一边去") i = Person("小二", 17) print(dir(i)) print(i.__dict__)
运行结果如下:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'test1', 'test2'] {'name': '小二', 'age': 17}
**
3,isinstance 判断对象是不是属于某一个类的实例对象
**
class Life: pass class Person: pass i = Person() print(isinstance(i, Person)) print(isinstance(i, Life))
运行结果如下:
True False
**
4,类对象
**
当python解释器执行class语句时,就会自动创建一个类对象
class Student: pass print(id(Student)) print(type(Student))
运行结果为:
2468217837064 <class 'type'> # Student这个类对象就是type下的一个实例对象
验证过程如下所示:
class Student: pass print(id(Student)) print(type(Student)) Stu2 = Student # Student这个对象可以重新赋值给新的变量 Stu2 , 进而实现相关的调用 s1 = Stu2() print(s1)
运行结果如下:
1748392130296 <class 'type'> <__main__.Student object at 0x000001971637C080>
**
5,类属性
**
类既然也是对象,那么类也拥有类属性和类对象
可通过赋值语句定义类属性
class Student: company = "爱的魔力" #类属性 count = 0 #类属性 def __init__(self, name, score): #实例属性 self.name = name self.score = score Student.count += 1 #使用 类名.点的方式访问类属性 def say_score(self): #实例方法 print("公司是%s" % Student.company) print("{0}的分数是{1}".format(self.name, self.score)) s1 = Student("小二", 59) #s1实例对象 自动调用init初始化方法 s2 = Student("小三", 58) s3 = Student("小五", 60) s1.say_score() s2.say_score() s3.say_score() print("一共创建了{0}个student对象".format(Student.count))
运行结果如下:
公司是爱的魔力 小二的分数是59 公司是爱的魔力 小三的分数是58 公司是爱的魔力 小五的分数是60 一共创建了3个student对象
**
6,类方法
**
class Student: company = "XXX" count = 0 @classmethod def print_company(cls): print(cls.company) Student.print_company()
输出结果为:
XXX
**
7,静态方法 在类中定义与类对象无关的方法 既不访问类属性也不访问实例属性
**
class Dog(object): @staticmethod def run(): print("狗在跑...") Dog.run() # 通过 类名. 调用静态方法 不需要创建对象,直接调用
**
8,__call__方法,定义了__call__方法的对象,成为“可调用对象”。即该对象可以像函数一样被调用
**
class SalaryAccount: def __call__(self, salary): print("领工资啦") year_salary = salary * 12 day_salary = salary // 22.5 hour_salary = day_salary // 8 return dict(year_salary=year_salary, month_salary=salary, day_salary=day_salary, hour_salary=hour_salary) s = SalaryAccount() print(s(5000))
运行结果如下:
领工资啦 {'year_salary': 60000, 'month_salary': 5000, 'day_salary': 222.0, 'hour_salary': 27.0}
**
9,可重写object中的__str__方法 此方法返回的是对“对象的描述” 可帮助查看对象的信息
**
没有重新str方法时打印的信息如下:
class Person: def __init__(self, name, age): self.name = name self.age = age p = Person("小二", 18) print(p)
<__main__.Person object at 0x000002329E57C080>
重新str方法后,打印的结果如下:
class Person: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return "名字是{0}年龄是{1}".format(self.name, self.age) p = Person("小二", 18) print(p)
名字是小二年龄是18
**
10,MRO函数 method resolution order 方法解析顺序 可通过mro()函数获得类的解析顺序
**
class A: def say(self): print("AAA") class B: def say(self): print("BBB") class C(B, A): pass c1 = C() c1.say() print(C.mro())
运行结果如下:
BBB [<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
**
11,super()调用父类的方法
**
class Person: def __init__(self,name,age): self.name = name self.age = age def say_name(self): print("我是",self.name) class Student(Person): def __init__(self,name,age,score): self.score = score Person.__init__(self,name,age) #类名.点的方式调用父类中的初始化方法 python解释器不会主动调用 def say_score(self): print(self.name,"分数是:",self.score) super().say_name() #super()点的方式调用父类中的方法 s1 = Student("张三", 15, 85) s1.say_score()
运行结果如下:
张三 分数是: 85 我是 张三
**
12,多态
**
1,多态是方法的多态,属性没有多态
2,多态的存在有两个必要条件:继承和方法重写
class Man: def eat(self): print("饿了,吃饭了") class ChineseMan(Man): def eat(self): print("中国人用筷子吃饭") class EnglishMan(Man): def eat(self): print("英国人用叉子吃饭") class IndianMan(Man): def eat(self): print("印度人用右手吃饭") def man_eat(m): if isinstance(m,Man): m.eat() #不同的对象调用不同的方法 else: print("不知道哪国人") man_eat(ChineseMan()) man_eat(EnglishMan()) man_eat(IndianMan())
运行结果如下:
中国人用筷子吃饭 英国人用叉子吃饭 印度人用右手吃饭
**
13,特殊方法 运算符方法
**
可重写上面的运算符方法,即实现了“运算符的重载”
class Person: def __init__(self, name): self.name = name def __add__(self, other): if isinstance(other, Person): return "{0}--{1}".format(self.name, other.name) else: return "不是同类对象,不能相加" def __mul__(self, other): if isinstance(other, int): return self.name * other else: return "不是同类对象,不能相乘" p1 = Person("小二") p2 = Person("小三") x = p1 + p2 print(x) print(p1 * 3)
运行结果如下:
小二--小三 小二小二小二
**
14,特殊属性
**
class A: pass class B: pass class C(B, A): def __init__(self, nn): self.nn = nn def cc(self): print("cc") c = C(3) print(dir(c)) print(c.__dict__) print(c.__class__) print(C.__bases__) print(C.mro()) print(A.__subclasses__())
运算结果如下:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'cc', 'nn'] {'nn': 3} <class '__main__.C'> (<class '__main__.B'>, <class '__main__.A'>) [<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>] [<class '__main__.C'>]
相关文章推荐
- python继承 +python多态+获取对象的信息+类中特殊的属性和方法+运算符重载+单例设计模式
- 8.python之面相对象part.2(特殊属性,类方法,静态方法)
- python-多态、类属性、类方法、静态方法、异常
- 类和对象(字段=变量、方法=函数、方法重载、静态成员、属性、构造函数)
- python 基础2 编码转换 pycharm 配置 运算符 基本数据类型int str list tupple dict for循环 enumerate序列方法 range和xrange
- python对象与属性相关的特殊方法
- python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法
- python面向对象学习(六)类属性、类方法、静态方法
- python 函数是可调用对象和特殊方法__call__
- Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇
- Python 多态 类属性 静态方法 简单工厂
- 非静态的字段、方法或属性“System.Web.UI.Page.Session.get”要求对象引用
- 非静态的字段、方法或属性“System.Web.UI.Page.ClientScript.get”要求对象引用
- 用JAVASCRIPT实现静态对象、静态方法和静态属性
- Python可调用对象__call__方法的用法分析
- php面向对象中static静态属性和静态方法的调用
- php面向对象基础概念(属性重载的魔术方法)__get(),__set(),__isset(),__unset()
- python的str,unicode对象的encode和decode方法(转)
- chapter9: python 类的方法,属性,迭代器(new[old]-type class,[un]bound method,super,protocol,property,iterators)
- 面向对象之字段,属性,类,实例,构造方法,重载