学习日志---python(新式类,面向对象)

类型与类:

使用新式类,class a(object) 这样a就可以是type类型了,新式类

python使用__new__来构造对象,使用__init__来初始化对象,这两个是分开的,在new出的同时可以调用init方法来初始化,可以带参数;类中的每个函数(方法)都要加上self,表示为实例上的方法。self代表这个类的实例。

实例变量:是针对每个实例的变量,每个实例的变量是不同的;

类变量:是针对类的,类中的这个变量都一样;

class A(object):
    #这个是类变量
    author = ‘shizhen‘
    #初始化方法,是什么样子,初始化就要根据这个格式
    def __init__(self,page):
        #这个是实例变量
        self.pa = page

a = A(100)
b = A(200)
print a.pa,b.pa,a.author,b.author

#动态语言的特点是可以随时给一个对象增加额外的属性,如这里,给a对象加入了book属性;
a.book = ‘OMG‘
print a.book

#这里的author不是类变量,而是a对象创建了一个实例变量,外界访问时优先访问实例变量;
a.author = ‘lixuan‘
print a.author

类方法和静态方法

class A(object):
    author = ‘shizhen‘
    
    #self是实例方法,实例化后才可使用。函数的第一个要是self
    def __init__(self,page):
        self.pa = page
        
    #类方法,加@,且传入的第一个参数是cls,调用时直接用类调用
    @classmethod
    def class_method(cls,msg):
        return msg
        
    #静态方法,加@,直接传入待传入参数即可,用类去声明调用    
    @staticmethod
    def static_method(msg):
        return msg

print A.class_method("haha")
print A.static_method("haha")

派生子类

python支持多继承;

class A(object):
    author = ‘shizhen‘
    def __init__(self,page):
        self.pa = page
        print self.pa
    def f(self,number):
        print number + 1
#继承
class B(A):
    def __init__(self,id):
        #这里是调用父类的初始化方法,新式类可用super
        super(B, self).__init__(id)

b = B(10)
b.f(10)

dir和dict---查看属性

每个对象,每个类都有自己的dict,相当于一个namespace,存放自己类的属性

dir是内建函数,可以直接调用,返回所有对象中的属性,包括父类的属性,返回一个序列,只说明属性有哪些;

dict则是类自带方法,返回当前类中所有的属性,不包括父类的属性,返回的是个字典,包括属性以及其值;

class A(object):
    author = ‘shizhen‘
    def __init__(self,page):
        self.pa = page
    
a = A(10)
#这个是a这个实例的字典,在a创建后,只有10这个元素,因此字典中只有10
print a.__dict__
#调用对象自己的方法查看当前类的属性
print A.__dict__
print dir(A)
print dir(a)
#文档方法
A.__doc__

析构函数

__del__:当对象的引用技术为0的时候,python的解释器会自动调用这个函数,如果是继承机构的话,会del先释放父类对象;

可见性

__id表示private,只有类中可以调用;

多重继承

新式类采用的是广度优先的算法;

*attr

class A(object):
    author = ‘shizhen‘
    def __init__(self,page):
        self.__pa = page
    def f(self):
        print "hello"

a = A(10)
#这个是获取一个对象,把里面的方法拿出来,供外界使用
getattr(a,‘f‘)()
#判断a类中是否有这个方法
print hasattr(a,‘f‘)
#还有delattr和setattr,删除和设置,这也是动态语言的特点

这个方法不仅适用于类,同时也适用于实例

内建函数

issubclass(sub,sup) 判断是否为子类

isinstance(obj,classType) 判断是否为类的实例

练习题:

  1. 实现一个(x,y)的Point类表示坐标上的点(X,Y),如果在构建Point对象的时候没有提供x,y,则默认是原点, 实现一个Retangle类表示一个矩形,使用四个点作为这个矩形的构造函数的参数,实现一个area的实例方法返回该矩形的面积
class Point(object):
    def __init__(self,x=0,y=0):
        self.xpoint=x
        self.ypoint=y

class Retangle(object):
    def __init__(self,point1,point2,point3,point4):
        self.point1 = point1
        self.point2 = point2
        self.point3 = point3
        self.point4 = point4
    def findCK(self,point1,point2,point3,point4):
        self.length = abs(point1.xpoint-point2.xpoint)
        self.width = abs(point2.ypoint-point3.ypoint)
    def area(self):
        self.findCK(self.point1,self.point2,self.point3,self.point4)
        self.result = self.length*self.width
        return self.result

p1=Point(-1,2)
p2=Point(3,2)
p3=Point(3,-1)
p4=Point(-1,-1)

re = Retangle(p1,p2,p3,p4)
print re.area()

2.实现一个单例(singleton),即所有类的实例实际都指向同一个对象,也可以理解为,所有的id返回都是同样的内存地址。

class singleton(object):
    #在new上做分配,保证只分配一次空间
    def __new__(cls):
        if not hasattr(cls,‘_instance‘):
            original = super(singleton, cls)
            cls._instance = original.__new__(cls)
        return cls._instance

s = singleton()
p = singleton()
s.page = 10
print p.page

new是分配空间时用的,init是分完之后初始化用的

时间: 2024-11-07 07:26:48

学习日志---python(新式类,面向对象)的相关文章

Cocos2d-x 3.1.1 学习日志3--C++ 初始化类的常量数据成员、静态数据成员、常量静态数据成员

有关const成员.static成员.const static成员的初始化: 1.const成员:只能在构造函数后的初始化列表中初始化 2.static成员:初始化在类外,且不加static修饰 3.const static成员:类只有唯一一份拷贝,且数值不能改变.因此,可以在类中声明处初始化,也可以像static在类外初始化 #include <iostream> using std::cout; using std::endl; class base { public: base(int

Python新式类和经典类的区别

@Python新式类和经典类的区别 class ClassicClass(): pass class NewStyleClass(object): pass x1 = ClassicClass() x2 = NewStyleClass() print x1.__class__, type(x1) print x2.__class__, type(x2) 输出结果: __main__.ClassicClass <type 'instance'> <class '__main__.NewSt

【Python】Python 新式类介绍

本文转载自:kaka_ace's blog 我们使用 Python 开发时, 会遇到 class A 和 class A(object) 的写法, 这在 Python2 里是有概念上和功能上的区别, 即经典类(旧式类)与新式类的区别, 英文上分别描述为 old-style(classic-style) 与 new-style. 通过搜索, 先查阅了三个资料链接: 官方文档 stackoverflow 解答 Python Types and Objects 根据 stackoverflow 答案引

Python新式类与经典类的区别

1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类,则称之为“经典类”. “新式类”和“经典类”的区分在Python 3之后就已经不存在,在Python 3.x之后的版本,因为所有的类都派生自内置类型object(即使没有显示的继承object类型),即所有的类都是“新式类”. 官方文档 https://www.python.org/doc/new

Python新式类

1.Python  2.x版本默认旧式类,通过继承object为新式类 2.新式类广度搜索继承,旧式类深度搜索继承 3.__new__方法 4.统一了类x.__class__和类型(type(x)) 5.增加了__slots__,去除了__dict__属性(用来记录实例中属性和方法,让实例绑定任意属性的字典),只有slots中有的属性才能被使用,不能动态增加属性. 6.增加了__getattribute__方法,该方法在实例访问属性时被调用,无论有没有对应的属性,有返回 7.新增很多管理内建函数

Python新式类继承的C3算法

在Python的新式类中,方法解析顺序并非是广度优先的算法,而是采用C3算法,只是在某些情况下,C3算法的结果恰巧符合广度优先算法的结果. 可以通过代码来验证下: class NewStyleClassA(object): var = 'New Style Class A' class NewStyleClassB(NewStyleClassA): pass class NewStyleClassC(NewStyleClassA): var = 'New Style Class C' class

python 新式类和旧式类

新式类和旧式类 python的新式类是2.2版本引进来的,我们可以将之前的类叫做经典类或者旧类. 为什么要在2.2中引进new style class呢?官方给的解释是: 为了统一类(class)和类型(type). 在2.2之前,比如2.1版本中,类和类型是不同的,如a是ClassA的一个实例,那么a.__class__返回 ' class    __main__.ClassA' ,type(a)返回总是<type 'instance'>.而引入新类后,比如ClassB是个新类,b是Clas

Python 新式类与经典类

新式类,经典类 查询匹配 广度查询 横着对每个类进行查询 深度查询 无视平级类,直接寻找下级类 #python 3.0 #新式类 广度查询 #经典类 广度查询 #python 2.0 #新式类 广度查询 #经典类 深度查询

Python新式类 单例模式与作用域(四)

1 新式类与旧式类 新式类拥有经典类的全部特性之外,还有一些新的特性,比如 __init__发生变化,新增了静态方法__new__,python3目前都采用新式类,新式类是广度优先,旧式类是深度优先 #新式类 class C(object): pass #经典类 class B: pass (1)内置的object对象 1. __new__,__init__方法 这两个方法是用来创建object的子类对象,静态方法__new__()用来创建类的实例,然后再调用 __init__()来初始化实例.