13章面向对象

13.4.1 类的数据属性

  数据属性仅仅是所定义的类的变量,这种属性要么是由类的方法来更新,要么是主程序其他地方更新,这种属性类似Java中静态变量。这种数据是与所属类对象绑定不依赖于任何类实例。类属性仅于类相关,和实例属性不同,类属性和实例无关。

>>> class C(object):
    foo = 100

>>> print C.foo
100
>>> C.foo = C.foo+1
>>> C.foo
101
>>> 

13.4.2
  1.方法

    类定义的一部分函数(方法即是类属性)

  2.绑定

13.4.3

  查看一个类具有哪些属性dir(), __dict__.

13.5 实例

  初始化:函数操作符

>>> class MyClass(object):
	pass

>>> myClass = MyClass()  #实例化
>>>

__init__():“构造器”方法。一旦对象创建了, python会检查是否实现了__init__()方法。默认如果没有定义(或覆盖)该方法,对实例不会施加任何操作,即任何所需特定操作,都需要程序员实现__init__()。如没有实现该方法则返回它的对象。

__new__(): "构造器方法", 比__init__更像构造器。因为它会返回一个合法实例。该方法是在新式类中新出现的方法,它作用在构造方法建造实例之前

>>> class T(object):
	def __init__(self, *args, **kwargs):
		print 2
	def __new__(cls, *args, **kwargs):
		print 1
		return object.__new__(T,*args, **kwargs)

>>> t = T()
1
2
>>>

__del__():“解构器”方法。解构器是在类实例所有的引用被清除掉了才被调用的。

13.6实例属性

  设置实例的属性可以在实例创建后任意时间进行,也可以在能够访问实例的代码中进行,主要是在__init__()中。通过内建dir()可以打印所有实例属性

注:python可以在“运行时”创建实例,允许对象熟悉动态创建。

13.7 绑定和方法的调用

  self变量用于在实例方法中引用方法所绑定的实例。因为方法的实例在任何方法中总是作为第一个参数传递,self被选中用来代表实例。(类似java 的this)

  调用绑定方法:通过实例调用

  调用非绑定方法:最形象的类似子类继承父类,需要调用父类的构造器.

>>> class A(object):
    pass

>>> class B(A):
    def __init__(self):
        A.__init__(self)

13.8 静态方法和类方法

  通常的方法需要一个self作为第一个参数,并且对于绑定方法的调用来说,self是自动传递给这个方法的,而对于类方法来说,需要类不是实例作为第一个参数,它由解释器传给方法。类不需要特别的命名,类似self,不过大多数使用cls

>>> class TestStaticMethod(object):
    @staticmethod
    def foo():
        print ‘Test Static method‘

>>> class TestClassMethod(object):
    @classmethod
    def foo(cls):
        print "Test Class method"

>>> static = TestStaticMethod()
>>> static.foo()
Test Static method
>>> TestStaticMethod.foo()
Test Static method
>>> Class = TestClassMethod()
>>> Class.foo()
Test Class method
>>> TestClassMethod.foo()
Test Class method

13.11 继承

  

>>> class P(object):
	def foo(self):
		print ‘Hi, i am P-foo()‘

>>> p = P()
>>> p.foo()
Hi, i am P-foo()
>>> class C(P):
	def foo(self):
		print ‘Hi, i am C-foo()‘

>>> c = C()
>>> c.foo()
Hi, i am C-foo()

C类继承了P的foo()方法, 但因为C定义了自己的foo()方法,所以P中的foo()方法被覆盖。

如果想调用父类的foo()方法,需要调用一个未绑定的基类方法,明确给予子类的实例。

>>> class P(object):
    def foo(self):
        print ‘Hi, i am P-foo()‘

>>> class C(P):
    def foo(self):
        super(C, self).foo()
        print ‘Hi, i am C-foo()‘

>>> c = C()
>>> c.foo()
Hi, i am P-foo()
Hi, i am C-foo()
>>> 

和java不同的是,当从一个带构造器__init__()的类继承,如果不去覆盖__init__(),它将会被继承并自动调用,但如果子类覆盖__init__(),子类被实例化时基类的__init__()就不会被调用。如果想调用父类__init__(),就需要显示使用子类的实例去调用基类方法。

>>> class P(object):
    def __init__(self):
        print ‘calling p is constructor‘

>>> class C(P):
    def __init__(self):
        print ‘calling C is constructor‘

>>> c = C()
calling C is constructor
>>> class C(P):
    def __init__(self):
        P.__init__(self)
        print ‘calling C is constructor‘

>>> c = C()
calling p is constructor
calling C is constructor

13.12 类的一些内建函数

issubclass()判断一个类实另一个的子类, isinstance()判断一个对象是否是另一个给定类的实例

hasattr()判断一个对象是否有一个特定属性,一般用作访问属性前作检查

getattr(), setattr() 相应地取和赋值给对象的属性

delattr(),相应的从一个对象中删除属性

>>> class myClass(object):
    def __init__(self):
        self.foo = 100

>>> myInst = myClass()
>>> hasattr(myInst, ‘foo‘)
True
>>> getattr(myInst, ‘foo‘)
100
>>> setattr(myInst, ‘bar‘, 200)
>>> getattr(myInst, ‘bar‘)
200
>>> dir(myInst)
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘, ‘bar‘, ‘foo‘]

13.14 私有化

__双下划线:有双下划线的属性在运行时被“混淆”,所以直接访问是不允许的,内部是在名字前面加上下划线和类名,可以防止子类和父类同名的冲突情况即子类也不能访问。类似java的private

_单下划线:在属性前加单下划线可防止模块的属性用“from model import *”来加载.子类可访问,类似java protect

__xxx___ 定义的是特列方法。像__init__之类的

时间: 2024-10-12 08:43:50

13章面向对象的相关文章

范磊 C++ 第6章 面向对象

1 // section_6.cpp : Defines the entry point for the console application. 2 //范磊C++ 第6章 面向对象 3 4 #include "stdafx.h" 5 #include "iostream" 6 7 8 9 //6.3.7 对象只能调用类中存在的方法(函数) 10 using std :: cout; 11 class Human 12 { 13 public: 14 void w

第 13 章 装饰模式【Decorator Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> Ladies and gentlemen,May I get your attention,Please?,Now I’m going to talk about decoratorpattern.装饰模式在中国使用的那实在是多,中国的文化是中庸文化,说话或做事情都不能太直接,需要有技巧的,比如说话吧,你要批评一个人,你不能一上来就说你这个做的不对,那个做的不对,你要先肯定他的成绩,表扬一下优点,然后再指出瑕疵,指出错误的地方

第05章(面向对象——中)

1 /***************** 2 ***第五章面向对象(中) 3 *******知识点: 4 **************1.多态 5 ******************1.1 概念 6 ******************1.2 实现方式 7 **************2.抽象类 8 ******************2.1 关键字 9 ******************2.2 概念定义 10 ******************2.3 使用 11 ************

第13章 模版方法模式(Template Method)

原文  第13章 模版方法模式(Template Method) 模板模式 模板模式 举例:模拟下数据库的update方法,先删除在插入. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47     abstract class SqlManage     {         publi

第04章(面向对象——上)

1 /***************** 2 ***第四章面向对象(上) 3 *******知识点: 4 **************1.类和对象 5 ******************1.1 关键字 6 ******************1.2 定义 7 ******************1.3 使用 8 **************2.方法和属性 9 ******************2.1 关键字 10 ******************2.2 方法重载和重写 11 ******

JavaScript权威指南第13章 web浏览器中的javascript

13.1 客户端javascript window对象是所有的客户端javascript特性和api的主要接入点.表示浏览器的一个窗口,可以通过window对象来引用它. window 的方法 alert() prompt() confirm() 13.2 在html里嵌入javascript 4种方法: 内联:放置在<script></script>标签之中 外部引入:<script src="   "></script> html程序

Javascript设计模式与开发实践读书笔记(1-3章)

第一章 面向对象的Javascript 1.1 多态在面向对象设计中的应用   多态最根本好处在于,你不必询问对象“你是什么类型”而后根据得到的答案调用对象的某个行为--你只管调用行为就好,剩下的一切多态会搞定 换句话说就是:多态的最根本作用就是把过程化的条件分支语句转化为对象的多态性,从而消除这些条件分支语句 例子:假设有一个地图应用,每个地图API提供商都提供了show方法,负责在页面上显示地图,首先我们用一些分支条件语句来实现一个调用方法renderMap 此时一旦需要增加搜搜地图的应用,

《深入Java虚拟机学习笔记》- 第13章 逻辑运算

<深入Java虚拟机学习笔记>- 第13章 浮点运算 <深入Java虚拟机学习笔记>- 第13章 逻辑运算,布布扣,bubuko.com

阅读《实例化需求》1-3章有感

今天我阅读了<实例化需求>的1-3章. 第一章主要是讲实例化需求的好处.实例化需求说明是一组过程模式,他帮助团队构建正确的产品. 使用实例化需求说明,团队编写的文档恰到好处,在短迭代或基于流的开发中可以有效地协助变更. <实例化需求>这本书不是以理论的方式来构建一个案例来阐述实例化需求说明的好处,而是来自 于那些来自于那些大大受益于实例化需求说明的团队. 实例化需求可以更有效地实施变更,主要是通过活文档.活文档是系统功能的一个信息源,与程序 代码一样可靠,但更容易使用和理解.他帮助