python---面向对象高级进阶
静态方法,调用静态方法后,该方法将无法访问类变量和实例变量
class Dog(object):
def __init__(self,name):
self.name = name def eat(self,food):
print("%s is eating %s"%(self.name,food)) d = Dog("Jack")
d.eat("banana") #静态方法写法
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod #静态类后,则无法调用类变量和实例变量
def eat(self): #需要传进来的是实例了,而不能调用类本身的属性
print("%s is eating %s"%(self.name,"banana")) d = Dog("Alex")
d.eat(d) #传入实例化后的一个实例
类方法,类方法后,可以访问类变量,但无法访问实例变量
class Dog(object):
name = "Mark"
def __init__(self,name):
self.name = name
@classmethod
def eat(self):
print("%s is eating %s"%(self.name,"banana")) #name为类变量,而非实例变量 d = Dog("Alex")
d.eat()
#运行结果:Mark is eating banana
属性方法,@property 调用属性方法后,该方法将是静态属性,调用不需要加(),直接调用即可
class Dog(object):
def __init__(self,name):
self.name = name
self.__food = None
@property
def eat(self):
print("%s is eating %s"%(self.name,"banana"))
@eat.setter
def eat(self,food):
print("set food:",food)
self.__food = food d = Dog("Alex")
d.eat #属性方法输出的是属性,不需要动态调用,即不需要d.eat()
属性方法修改,删除
class Dog(object):
def __init__(self,name):
self.name = name
self.__food = None
@property
def eat(self):
print("%s is eating %s"%(self.name,self.__food))
@eat.setter
def eat(self,food): #修改属性方法的参数
print("set food:",food)
self.__food = food
@eat.deleter #删除属性方法的参数
def eat(self):
del self.__food
print("deleted!!!!!") d = Dog("Mark")
d.eat
d.eat = "apple" #向属性方法种传递参数
d.eat
del d.eat #删除属性方法种的参数
d.eat
__metaclass__,__init___,__call__,__new__方法调用
# -*- coding:utf-8 -*-
# LC class MyType(type):
def __init__(self,*args,**kwargs):
print("Mytype init",args,kwargs)
def __call__(self, *args, **kwargs):
print("Mytype call",args,kwargs)
obj = self.__new__(self)
self.__init__(obj,args,kwargs) class Foo(object):
__metaclass__ = MyType #表示该类是由谁来实例化自己的(即Foo类)
def __init__(self):
print("foo init")
def __new__(cls, *args, **kwargs):
print("foo new")
return object.__new__(cls) f = Foo()
#在python2或者3中,执行顺序为:__new__ , __init__, __call__、
#__new__优于__init__执行
#__call__用于创建__new__
反射,类的反射
class Dog(object):
def __init__(self,name):
self.name = name def eat(self):
print("%s is eating"%self.name) def bulk(self):
print("%s is yelling"%self.name) d = Dog("Jack") choice = input(">>:").strip()
print(hasattr(d,choice)) #表示对象中是否含有choice的属性,包含变量,方法等 if hasattr(d,choice):
print(getattr(d,choice)) #获取对象中的choice属性,如果是变量,则获取变量值,如果是方法,可以通过加()进行执行
getattr(d,choice)()
else:
setattr(d,choice,bulk) #设置对象中的choice属性,如可以新增一个变量或方法
getattr(d,choice)(d) #func = get(d,choice), func(d)
d.talk(d) delattr(d,choice) #删除对象中的choice属性,可以是变量,也可以是方法
d.talk(d)
类的特殊方法:
# -*- coding:utf-8 -*-
# LC #__doc__ 输出类的描述信息
class Foo:
'''
类的描述信息
'''
def func(self):
pass print(Foo.__doc__) #__module__ 输出当前操作的对象在那个模块
#__class__ 输出当前操作的对象的类是什么 from lib.aa import C
obj = C()
print(obj.__module__)
print(obj.__class__) #__call__ 对象后加括号,触发执行
#构造方法的执行是由创建对象触发的,即:对象=类名();而对于__call__方法的执行是由对象加括号触发的,即对象()或类()()
class Dog(object):
def __init__(self,name):
self.name = name def __call__(self, *args, **kwargs):
print("%s running call"%self.name,args,kwargs) obj2 = Dog("alex")
obj2("wawawa",sex="F") #__dict__ 查看类或者对象中的成员 print(Dog.__dict__)
print(obj2.__dict__) #__str__ 如果一个类中定义了__str__方法,则在打印对象的时候,默认输出该方法(__str__)的值
class Cat(object):
def __str__(self):
return "str method" obj3 = Cat()
print(obj3) #__getitem__,__setitem__,__delitem__ 用于索引操作,如字典,分别进行获取,设置,删除数据 class apple(object):
def __init__(self):
self.data = {}
def __getitem__(self, key):
print("get apple %s"%key)
return self.data.get(key)
def __setitem__(self, key, value):
print("setting apple,%s,%s"%(key,value))
self.data[key] = value
def __delitem__(self, key):
print("deleting apple %s"%key)
del self.data[key] obj4 = apple()
obj4["apple1"] = "red"
obj4["apple2"] = "green" res = obj4["apple1"]
print('---',res)
print(obj4.data)
del obj4["apple1"]
res = obj4["apple2"] #删除后则没有了。输出为None,具体是否删除,也是由__delitem__方法定义的
print('---',res) #__new__
class Foo(object):
def __init__(self,name):
self.name = name f = Foo("Jack")
print(type(f))
print(type(Foo))
异常处理
names = ["Alex","Jack"]
dict = {} try:
names[3]
except IndexError as e: #抓具体的错误类型
print("ERROR !!!",e) try:
names[3]
except Exception as e: #包含所有的错误类型,不建议使用,建议使用在最后抓未知错误
print("ERROR !!!",e) try:
dict["age"]
except KeyError as e: #抓具体的错误类型
print("ERROR !!!",e) try:
#dict["age"]
#names[3]
print(names[3])
except (IndexError,KeyError) as e: #抓取两个错误中的任意一个,代码谁先出错则执行谁
print("ERROR",e)
else: #没有错的时候执行
print("all is well") finally: #不管有没有错,都执行
print("不管有你没有错,都执行") class TestException(Exception): #自定义异常
def __init__(self,msg):
self.msg = msg try:
raise TestException('自定义异常')
except TestException as e:
print(e)
断言,即是一种简单的判断,如果是True,则通过,如果是Fasle,则报错。
assert type(obj.name) is int
python---面向对象高级进阶的更多相关文章
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- 【转】python 面向对象(进阶篇)
[转]python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 ...
- python 面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python 面向对象高级应用(三)
目录: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__getattr__ 二次加工标准类型(包装) __ ...
- python 面向对象(进阶篇)转载武沛齐
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- Python学习笔记【第十一篇】:Python面向对象高级
isinstance(obj,cls)和issubclass(sub,super) class Person(object): def __init__(self, name, age, sex, n ...
- python面向对象高级:Mixin多重继承
继上一篇学习笔记:python面向对象的继承与多态,本篇就Mixin扩展类的方法写下学习笔记 Mixin Mixin编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是 ...
- Python之路【第十二篇】:Python面向对象高级
一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究 ...
- 【Python之路】特别篇--Python面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- Python之路,Day8 - Python基础 面向对象高级进阶与socket基础
类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...
随机推荐
- 【一天一道LeetCode】#104. Maximum Depth of Binary Tree
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 来源:http ...
- [C++学习历程]Visual Studio 2010 中文旗舰版 安装
作者: 苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/19765441 要开始学习C++了,先装个开发环境吧,没有选择最新的2 ...
- hive的map类型处理
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-CollectionFunc ...
- Python+Visual Studio
一直在找一个比较好的Python IDE,无奈找来找去都不太好用,由于经常用Visual Studio,所以很希望找到一个能够在VS中的Python扩展.今天发现了一个很给力的VS扩展,可以在VS中方 ...
- Redis简介 Linux安装Redis Redis使用
其他一些操作(包括 APPEND.GETRANGE.MSET 和 STRLENGTH 也可用于字符串.请参见http://doc.redisfans.com/string/index.html ) 使 ...
- Android平台 Psensor传感器调试方法
一. 驱动层调试1.在板级dts文件中增加相应的dts代码,如:调试sensor类,在代码中找到已经有的代码在修改,I2C使用那根(一般为I2C3),I2C地址(找datasheet或者FAE),哪个 ...
- 【UML 建模】UML入门 之 交互图 -- 时序图 协作图详解
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/17927131 . 动态图概念 : 从静态图中抽取瞬间值 ...
- LeetCode之“树”:Validate Binary Search Tree
题目链接 题目要求: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is ...
- 【LaTeX排版】LaTeX论文排版<三>
A picture is worth a thousand words(一图胜千言).图在论文中的重要性不言而喻,本文主要讲解图的制作与插入. 1.图像的插入 图像可以分为两大类:位图和向量图 ...
- 【55】java异常机制剖析
一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用.有异常就说明程序存在问题,有助于我们 ...