属性+方法——>类(数据和函数)
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__()