Python自动化之面向对象进阶
1 静态方法
静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法。
class Dog(object):
def __init__(self, name):
self.name = name
@staticmethod # 把eat方法变为静态方法
def eat(self):
print("%s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat()
运行结果
TypeError: eat() missing 1 required positional argument: 'self'
正确的调用结果
d = Dog("ChenRonghua")
d.eat() #不能识别类的实例变量
2 类方法
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。
class Dog(object):
def __init__(self,name):
self.name = name
@classmethod
def eat(self):
print("%s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat()
运行报错
AttributeError: type object 'Dog' has no attribute 'name'
因为name是实例变量,所以不能访问。
class Dog(object):
name = "ddddd"
def __init__(self,name):
self.name = name
这样就可以正常调用了。
3 属性方法
属性方法的作用就是通过@property把一个方法变成一个静态属性
class Dog(object):
def __init__(self,name):
self.name = name
@property
def eat(self):
print(" %s is eating" %self.name)
d = Dog("ChenRonghua")
d.eat()
运行报错
TypeError: 'NoneType' object is not callable
d = Dog("ChenRonghua")
d.eat
运行没有错误
ChenRonghua is eating
4 类的特殊成员
1.doc 类的描述信息
class Test():
"""这是类的描述信息"""
pass
a=Test().doc
print(a)
运行结果
这是类的描述信息
2.module 和 class
module 表示当前操作的对象在那个模块
class 表示当前操作的对象的类是什么
3. init 构造方法,通过类创建对象时,自动触发执行。
4.del 析构方法,当对象在内存中被释放时,自动触发执行。
5.call 对象后面加括号,触发执行。
构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
6.dict 查看类或对象中的所有成员
7.str 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
class Foo(object):
def __getitem__(self, key): (1)
print('__getitem__', key) (1)
def __setitem__(self, key, value): (2)
print('__setitem__', key, value) (2)
def __delitem__(self, key): (3)
print('__delitem__', key) (3)
obj = Foo()
result = obj["k1"]
运行结果
执行(1):getitem k1
obj['k2'] = 'alex'
运行结果
执行(2):setitem k2 alex
__setitem__ k2 alex
运行结果
执行(3):delitem k1
9. new \ metaclass
通过type的方式创建类
def func(self):
print 'hello wupeiqi'
Foo = type('Foo',(object,), {'func': func})
#type第一个参数:类名
#type第二个参数:当前类的基类
#type第三个参数:类的成员
5 类的创建过程和实例化过程
class MyType(type):
def __init__(self, what, bases=None, dict=None):(2)
print("--MyType init---")
super(MyType, self).__init__(what, bases, dict)
def __call__(self, *args, **kwargs): (4)
print("--MyType call---")
obj = self.__new__(self, *args, **kwargs)(5)
self.__init__(obj, *args, **kwargs)(7)
class Foo(object):
__metaclass__ = MyType (1)
def __init__(self, name): (8)
self.name = name
print("Foo ---init__")
def __new__(cls, *args, **kwargs):(6)
print("Foo --new--")
return object.__new__(cls)
# 第一阶段:解释器从上到下执行代码创建Foo类
# 第二阶段:通过Foo类创建obj对象
obj = Foo("Alex") (3)
1.正常情况下,如果没有__metaclass__的话,就会寻找父类,如果父类也没有__metaclass__,就会使用内置的type创建类对象,但是这里是指定了MyType来创建类。
2.(2)创建Foo类 然后到(3)需要Foo类实例化。
3.(4)开始进行实例化的创建。
4.(5)通过__new__实例化出Foo对象,会得到一个Foo的实例对象地址。
5.通过(5)调用了(6)返回一个Foo实例对象地址。
6.(7)进行__init__初始化,调用了(8),到现在Foo()实例化完成。
6 反射 hasattr、getattr、setattr和delattr
hasattr
检查是否含有成员或方法
class Foo(object):
def __init__(self, name):
self.name = name
def eat(self):
print("%s eating" % self.name )
return "eat"
obj = Foo("xiaoming")
print(hasattr(obj, "__module__"))
print(hasattr(obj, "name"))
getattr
获取成员的值 getattr(object, name, default=None)
print(getattr(obj, "name","meiyoua"))
如果有就打印name的值,没有就打印meiyoua
setattr
添加成员
setattr(obj,"age","18")
delattr
删除成员
delattr(obj,"name")
print(obj.name)
报错
print(obj.name)
AttributeError: 'Foo' object has no attribute 'name'
Python自动化之面向对象进阶的更多相关文章
- 周末班:Python基础之面向对象进阶
面向对象进阶 类型判断 issubclass 首先,我们先看issubclass() 这个内置函数可以帮我们判断x类是否是y类型的子类. class Base: pass class Foo(Base ...
- Python中级 —— 01面向对象进阶
面向对象进阶 总结.补充(http://blog.csdn.net/fgf00/article/details/52479307) 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 ...
- Python学习之面向对象进阶
面向对象进阶当然是要谈谈面向对象的三大特性:封装.继承.多态 @property装饰器 python虽然不建议把属性和方法都设为私有的,但是完全暴露给外界也不好,这样,我们给属性赋值的有效性九无法保证 ...
- Python之路【第六篇】python基础 之面向对象进阶
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 和 issubclass(su ...
- python学习总结(面向对象进阶)
-------------------类属性和实例属性关系------------------- 1.类属性和实例属性关系 1.实例属性 实例对象独有的属性 2.类属性 ...
- Python基础之面向对象进阶一
一.isinstance(obj,cls)和issubclass(sub,super) 1.isinstance(obj,cls)检查obj是否是类 cls 的对象 class A: pass obj ...
- Python自动化开发 - 面向对象(二)
本节内容 1.isinstance(obj,cls)和issubclass(sub,super) 2.反射 3.__setattr__,__delattr__,__getattr__ 一. isins ...
- Python自动化开发 - 面向对象(一)
本节内容 1.编程范式 面向过程编程 面向对象编程 2.面向对象编程介绍 类的语法 类与实例内存分配 构造方法 自定义方法 3.面向对象特性 一.编程范式 编程是程序员 用特定的语法+数据结构+算法组 ...
- python之路----面向对象进阶一
一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() i ...
随机推荐
- Java关键字——final
final在Java中表示的意思是最终,使用final关键字声明类属性.方法,注意: 1.使用final声明的类不能有子类 2.使用final声明的方法不能被子类所覆写 3.使用final声明的变量即 ...
- Eclipse学习笔记——快捷键
alt+/ 直接呼出要重写的方法 ctrl+1 快速修复(没导包,没抛出异常等等) ctrl+shift+o 导包 ctrl+shift+F 格式化代码块(自动给代码排版) alt+方向键 向前向后( ...
- Android学习笔记——Button
该工程的功能是实现在activity中显示一个TextView和一个Button 以下代码是MainActivity中的代码 package com.example.button; import an ...
- js确定要删除吗
js代码 function confirm_redirect(msg, url) { if (confirm(msg)) { location.href=url; } } html <a hre ...
- Win7系统中提示:本地无法启动MySQL服务,报的错误:1067,进程意外终止的解决方法。
Win7系统中提示:本地无法启动MySQL服务,报的错误:1067,进程意外终止的解决方法. 在本地计算机无法启动MYSQL服务错误1067进程意外终止.这种情况一般是my.ini文件配置出错了1.首 ...
- OC-self关键字
self关键字 1. 成员变量和局部变量同名 当成员变量和局部变量同名时,采取就近原则,访问的是局部变量 用self访问成员变量,区分同名的局部变量 2.使用细节 1) 出现的地方:所有的OC ...
- Spring--Spring容器
在使用Spring所提供的各种丰富而神奇的功能之前,必须要在Spring IoC容器中装配好Bean,并建立Bean和Bean之间的关联关系. Spring提供了多种配置方式来实现Bean的装配.但在 ...
- Linux 脚本 sh 和 ./ 的区别
如果.不在PATH里面,要执行当前目录下的可执行文件,使用全路径:./executable-file PATH是环境变量,如果将当前目录“./”添加到环境变量中,那么也可以不用“./”,直接输入当前目 ...
- 【10-25】OOP基础-飞机游戏知识点
知识点 鼠标适配器类为抽象类,使用匿名子类实现鼠标事件的重写,创建一个鼠标适配器对象 添加鼠标事件监听器到JPanel对象实现鼠标的响应 创建定时器Timer对象,在定时器的任务列表方法schedul ...
- asp.net core csrf
如果用tag 比如 <form asp-action="Login" asp-controller="Account" method="post ...