python类概论

属性+方法——>类(数据和函数)

class Turtle():   #类名约定用大写
    #属性
    color = 

    #方法
    def climb(self):
        pass
    def run(self):
        pass

tt = Turtle()    #创建对象
tt.run()    #调用

class Myclass(list):继承list
  pass
list2 = Myclass()
list2.append(4)
list2.append(3)
list2.sort()

封装:信息隐蔽技术

继承:子类自动共享父类之间数据和方法的机制

多态:不同对象对同一方法响应不同的行动

self是什么?相当于c++的this指针!

由一个类可以生成无数个对象,当一个对象的方法被调用的时候,对象会把自身作为第一个参数传给self参数,Python就知道是哪个对象在调用方法了。例如:

class Ball():
    def setName(self, name):
        self.name = name
    def kick(self):
        print("我叫%s,谁踢我。。。" % self.name)

a = Ball()
a.setName(‘qiu A‘)
b = Ball()
b.setName(‘qiu B‘)
a.kick()
b.kick()

 

Python的魔法方法(被双下滑线包围)

__init__(self)构造方法,用于实例化对象传入参数

上边两个例子没有显性声明构造方法,试用默认的无惨__init__()

#coding:utf8
class Ball:
        def __init__(self, name):
                self.name = name
        def kick(self):
                print("I am %s, 该死的,谁踢我" % self.name)

a = Ball(‘土豆‘)
a.kick()c = Ball() #报错

公有和私有?

公有可以通过点操作符访问

私有变量(名字改编"_类名__变量名")只需在变量名或函数名前加上“__”两个下划线!此时点name或者点__name都不能访问到(报错),试用getName()

#coding:utf8
class Person:
        __name = "liyi"
        def getName(self):
                return self.__name

p = Person()
#p.name  报错
#p.__name 报错
p.getName()
p._Person__name

继承

#coding:utf8
class Parent:
        def hello(self):
                print(‘父类方法hello‘)
        def func(self):
                print(‘父类方法func‘)
class Child(Parent):
        def func(self):
                print(‘子类方法func,覆盖了父类方法‘)

p = Child()
p.hello()
p.func()

[[email protected] ~]# python test.py
父类方法hello
子类方法func,覆盖了父类方法#coding:utf8import random as r
class Fish:
        def __init__(self):
                self.x = r.randint(0, 10)
                self.y = r.randint(0, 10)
        def move(self):
                self.x -= 1
                print("我的位置是:", self.x, self.y)

class Goldfish(Fish):
        pass
class Carp(Fish):
        pass
class Salmon(Fish):
        pass
class Shark(Fish):
        def __init__(self):          Fish.__init__(self)    #调用父类的构造方法,self是子类的实例对象,相当于Fish.__init__(Shark),因为为被重写了                      更好的方法:supper().__init__(),会自动把所有父类、父父类的方法                self.hungry = True
        def eat(self):
                if self.hungry:
                        print("吃货的梦想就是天天有的吃")
                        self.hungry = False
                else:
                        print("太撑了,吃不下了")

g = Goldfish()
s = Shark()
s.eat()
g.move()

多重继承:会使语法混乱,尽量不用

class Base1:
    pass
class Base2:
    pass
class C(Base1, Base2):
    pass

组合类:把类的实例化放到新类里边(横向关系)

#coding:utf8
class Turtle:
        def __init__(self, x):
                self.num = x
class Fish:
        def __init__(self, x):
                self.num = x
class Pool:
        def __init__(delf, x, y):
                self.turtle = x
                self.fish = y
        def print_num(self):
                print("水池总共有乌龟%d只,小鱼%d条" % (self.turtle.num, self.fish.num)

Mix-in机制

pass

类、类对象、实例对象:是三个不同的东西!

#coding:utf8
class C:    #类
        count = 0
a = C()
b = C()
a.count    #实例对象
C.count()   #类对象

属性和方法相同,属性会把方法覆盖掉!  属性名用名词,方法名用动词



Python绑定概念

Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念。所以需要在方法定义时加上self

a.__dict__查看实例所拥有的属性

A.__dict__查看类所拥有的的属性,可以看到方法,会有好多东西,用来跟踪与类相关的值。实例对象会共用,但会被实例属性覆盖



有关类和对象的BIF内置函数

issubclass(class, classinfo)如果第一个参数是第二个参数的子类,返回true,注意:

  • 非严格(自己可以认为是自己的子类);
  • 第二个参数可以是由多个class组成的tuple,有任何一个合适,就true;
  • 其他情况对抛出typeerror

isinstance(object, classinfo)检查某第一个参数实例对象是否属于一个类

  • 第二个参数可以是由多个class组成的tuple,有任何一个合适,就true;
  • 如果第一个参数传入不是对象类型,永远返回false
  • 如果第二个参数不是类或者由类对象组成的tuple,会抛出TypeError

点操作符号访问对象属性,attribute相关:

hasattr(object, name)  对象是否有制定的属性name,name需要用引号括起来,否则他会认为是变量,

getattr(object, name [, default])  获得对象object的name属性,如果不存在,返回default,若没有设置default,不存在时会抛出AttributeError

  • getattr(A, ‘b‘, ‘您所访问的属性不存在‘)

setattr(object, name, value)  设置对象name属性的值为value,若属性不存在会新建新的属性

delattr(object, name)  删除制定的属性,若不在抛出AttributeError

property()  通过属性设置属性,

  • x = property(getSize, setSize, delSize)设置一个x属性,能操作getSize、setSize、delSize(提前自己写好)方法
  • x可以作为调用接口,里边的方法可以大改,比如改名字等,增加方法。
  • 工作原理:组合了几个魔法方法


魔法方法

  • 被双上下滑线包围
  • 魔法方法是面向对象的Python的一切,如果你不知道魔法方法,说明你还没能意识到面向对象的Python的强大(不是说Python脚本)

__init__(self [,...])方法

  • 不写时,会默认存在一个无参的,写了会覆盖
  • 必须返回None,无 return,否则返回TypeError

__new__(cls[, ...])

  • 对象实例化时调用的第一个方法,在init之前,它有个很大的不同第一个参数不是self,而是这个类,返回一个对象
  • 平时极少重写,当继承一个不可变类型又需要修改的时候,需要重写new
class CapStr(str):    #继承str类是不可变得
    def __new__(cls, string):    #重写new,第一个传入class,叫其他名字也无所谓,只是为了区分
        string = string.upper()    #全部变大写
        return str.__new__(cls, string)    变完大写后,把它作为参数去调用基类的new方法

a = CapStr(‘I love Money‘)

__del__(self)析构

  • delete缩写,该对象的所有引用都被del时,自动销毁时调用它
  • 并非执行del x 就是调用x.__del__()
时间: 2024-10-25 17:40:47

python类概论的相关文章

【Python&数据结构】 抽象数据类型 Python类机制和异常

这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Python编程,借着本次机会仔细学习一下. 抽象数据类型 最开始的计算机语言,关注的都是如何更加有效率地计算,可以说其目的是计算层面的抽象.然而随着这个行业的不断发展,计算机不仅仅用于计算,开发也不仅只关注计算过程了,数据层面的抽象也变得同样重要.虽然计算机语言一开始就有对数据的抽象,但是那些都只是对一些最基本的

第六章 Python类(面向对象编程)

什么是面向对象编程? 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构.Python就是这种编程语言. 面向对象程序设计中的概念主要包括:对象.类.继承.动态绑定.封装.多态性.消息传递.方法. 1)对象:类的实体,比如一个人. 2)类:一个共享相同结构和行为的对象的集合.通俗的讲就是分类,比如人是一类,动物是一类. 3)继承:类之间的关系,比如猫狗是一类,他们都有四条腿,狗继承了这个四条腿,拥有了这个属性. 4)动态绑定:在不

Python类属性访问的魔法方法

Python类属性访问的魔法方法: 1. __getattr__(self, name)- 定义当用户试图获取一个不存在的属性时的行为 2. __getattribute__(self, name)- 定义当该类的属性被访问时的行为 注意:当__getattr__与__getattribute__同时重写时,访问属性时,优先调用__getattribute__,只有当被访问的属性不存在时才触发__getattr__ 3. __setattr__(self, name, value)- 定义当一个

LightMysql:为方便操作MySQL而封装的Python类

原文链接:http://www.danfengcao.info/python/2015/12/26/lightweight-python-mysql-class.html mysqldb是Python操作MySQL数据库的一个常用包.但在使用过程中,我认为用起来还不够简便.为此,我在mysqldb的基础上封装了一个Python类LightMysql. 先来看如何使用 example.py #!/usr/bin/env python # -*- coding: utf-8 -*- from Lig

python类的继承

Python 类的一些基本概念 Python中一切皆对象,声明变量函数等的过程实际上就是它们到内存中为对象分配的空间的连接.Python中的类同Java.C++一样,有自己的属性与方法.属于一个对象或类的变量被称为域. 域有两种类型--属于每个实例/类的对象或属于类本身,它们分别被称为实例变量和类变量. 类的变量 由一个类的所有对象(实例)共享使用.所有对象共用一个类变量的拷贝.对象的变量 由类的每个对象/实例拥有.因此每个对象有自己对这个域的一份拷贝. 类的方法与普通的函数只有一个特别的区别-

python 类组合

在使用一款云产品的python sdk过程中,发现了python类之间调用的另一种少见方法:类组合,那么类组合是用来干吗的呢? 我们知道,在python中,类之间的相互调用,我们习惯性的采用继承的方法,但是 除了继承方法,我们还可以采用类组合的方式来调用另一个类 官方的说法:让不同的类混合并加入到其他类中,来增强功能和代码重用性.你可以在一个大点的类中创建你自己的类的实例,实现一些其他属性和方法来增强原来的类对象. 举个例子: >>> class Name(object):       

Python类的__getitem__和__setitem__特殊方法

class testsetandget:    kk = {};      def __getitem__(self, key):          return self.kk[key];      def __setitem__(self, key, value):          self.kk[key] = value;a = testsetandget()a['first'] = 1print a['first']a.__setitem__('second', 2)print a._

Python 类特殊方法__getitem__如何使用?

本文和大家分享的主要是python类的特殊方法__getitem__相关内容,一起来看看吧,希望对大家学习python有所帮助. 凡是在类中定义了这个__getitem__ 方法,那么它的实例对象(假定为p),可以像这样 p[key] 取值,当实例对象做p[key] 运算时,会调用类中的方法__getitem__. 先用一个夸张一点的例子来说明这个问题. 当实例对象通过[] 运算符取值时,会调用它的方法__getitem__,从上面代码中输出二个笑脸可以看出来. 一般这样用 ''' 黄哥Pyth

python 类 六:继承自动寻找父类

本系列博客(python 类) 的部分例子来自于 <<python 核心编程 第二版>> 前面我们谈到 python 继承,是可以引用父类的__init__方法的 ,并在此基础上添加子类自己的特殊的属性的设定,形成子类自己的__init__  构造函数. 在这种方法中,必须显示的指出父类的名字. #coding:utf-8 class p(object):     def __init__(self,nm):         self.name  = nm class c(p):