[Python]面向对象编程---类、实例、方法的对比(4)
来源:互联网 发布:php self this区别 编辑:程序博客网 时间:2024/05/17 21:40
一、类属性 vs 实例属性
1、访问类属性
>>> class C(object): # 定义类 version = 1.2 # 静态成员
(1) 当用实例来访问类属性时,Python会先在实例中搜索名字version,然后是类,再就是继承树中的基类。
(2) 通过类才能更新它的值
>>> c = C() # 实例化>>> C.version # 通过类来访问1.2>>> c.version # 通过实例来访问1.2>>> C.version += 0.1 # 通过类来更新(只能这样)>>> C.version # 类访问1.3>>> c.version # 实例访问它,其值已被改变1.3
2、通过实例访问类的属性
任何对实例属性的赋值都会创建一个实例属性(如果不存在的话),并且对其赋值。
如果类属性中存在同名的属性,会产生副作用>>> c.version += 0.2 # 尝试更新类属性 等价于 c.version = C.version + 0.2>>> c.version # 只是创建了一个新的实例属性1.5>>> C.version # 没有更新类属性,只是创建了一个新的实例属性1.3>>> del c.version # 删除实例属性>>> c.version # 又可以访问到类属性1.3>>> C.version1.33、在类属性可变的情况下,通过实例可以更新类属性
>>> class Foo(object):... x = {2003: 'yes'} # 字典类型,可以修改
>>> foo = Foo() # 实例化 >>> foo.x{2003: 'yes'}>>> foo.x[2004] = 'no' # 通过实例修改类属性,生效>>> foo.x{2003: 'yes', 2004: 'no'}>>> Foo.x # 修改生效{2003: 'yes', 2004: 'no'}>>> del foo.x # 没有遮蔽所以不能删除掉Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: x二、绑定和方法调用
1、方法
(1) 方法仅仅是类内部定义的函数(是类属性,不是实例属性)
(2) 方法只有在其所属的类拥有实例时,才能被调用
(3) 任何一个方法定义中的第一个参数都是变量self,它表示调用此方法的实例对象。
2、调用绑定方法
MyClass类和实例mc,想要调用MyClass中的方法foo,只需调用mc.foo()即可。
3、调用非绑定方法
当没有实例并且需要调用一个非绑定方法时,必须传递self参数
def __init__(self, nm, ph, id, em): AddrBookEntry.__init__(self, nm, ph) # 通过父类名来调用 self.empid = id self.email = em三、静态方法 vs 类成员方法
静态方法可以被类或实例访问,不能访问类变量,不能访问实例变量。
类成员方法可以被类或实例访问,可以访问类变量,不能访问实例变量。
class MyClass(object): val1 = 'abcd' # 类属性 def __init__(self): self.val2 = 'a1b2c3' # 实例属性 @staticmethod # 使用装饰器定义静态方法 def staticMd(): print("static method, can't access val1 and val2") @classmethod # 使用装饰器定义类成员方法 def classMd(cls): print("class method, class: %s, val1 = %s, can't access val1" % (str(cls), cls.val1))
>>> mc = MyClass() # 实例化>>> mc.staticMd() # 通过实例访问静态方法static method, can't access val1 and val2>>> MyClass.staticMd() # 通过类访问静态方法static method, can't access val1 and val2>>> mc.classMd() # 通过实例访问类成员方法class method, class: <class 'MyData.MyClass'>, val1 = abcd, can't access val1>>> MyClass.classMd() # 通过类访问类成员方法class method, class: <class 'MyData.MyClass'>, val1 = abcd, can't access val1
>>> mc.val1 # 实例访问类属性'abcd'>>> MyClass.val1 # 类访问类属性'abcd'>>> mc.val2 # 实例访问实例属性'a1b2c3'>>> MyClass.val2 # 类无法访问实例属性Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: type object 'MyClass' has no attribute 'val2'
>>> mc.val1 = "haha" # 创建了一个实例属性 val1>>> mc.val1 # 访问实例属性 val1'haha'>>> MyClass.val1 # 此时类属性val1并没有改变'abcd'>>> MyClass.val1 = "a1b1c1" # 通过类更新类属性>>> MyClass.val1 # 类属性已经更新'a1b1c1'>>> mc.val1 # 实例属性val1没有改变'haha'>>> del mc.val1 # 删除实例属性val1>>> mc.val1 # 此时可以通过实例访问类属性'a1b1c1'
0 0
- [Python]面向对象编程---类、实例、方法的对比(4)
- python中面向对象的类,方法,实例
- python面向对象编程(2)—— 实例属性,类属性,类方法,静态方法
- Python 进阶_OOP 面向对象编程_self 的实例绑定
- Python面向对象编程(4)——类的继承与方法重载
- 【Python学习笔记】面向对象编程:类和实例
- 自学Python day6--------面向对象编程(类和实例)
- [Python]面向对象编程---实例(3)
- javascript 面向对象编程方法的实现与实例
- Python 面向对象编程基础(定义类并创建实例、创建实例属性、初始化实例属性、访问限制、类属性、属性名冲突、实例方法、类方法)
- Python一天入门15:面向对象的编程2-类与对象的方法
- Python面向对象的编程
- python 面向对象的编程
- Python面向对象的编程
- python面向对象的编程
- 【Python基础】1.3.1 面向过程编程与面向对象编程(类)实例
- Python面向对象编程中公共初始化方法的实现
- python中面向对象编程的特殊方法
- PLSQL的使用
- useradd和groupadd 详解
- 基础学习day07--broadcastReceiver
- 在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib
- Android开发集成微信分享
- [Python]面向对象编程---类、实例、方法的对比(4)
- hibernate获取session的两种方式分别是openSession() 方法和getCurrentSession() 方法。
- Construct Binary Tree from Preorder and Inorder Traversal 解题报告
- 【机房重构】组合查询——模板方法
- android google官方的下拉刷新SwipeRefreshLayout
- 日处理20亿数据,实时用户行为服务系统架构实践
- java 多态
- PCB布线中的地线干扰分析与抑制方法
- 【Java Utility】Jsoup网页爬虫工具简介Java HTML PARSER【一】