本文共 9086 字,大约阅读时间需要 30 分钟。
class Turtle: # Python 中的类名约定以大写字母开头 """关于类的一个简单例子""" # 属性 color = 'green' weight = 10 legs = 4 shell = True mouth = '大嘴' # 方法 def climb(self): print("我正在很努力的向前爬......") def run(self): print("我正在飞快的向前跑......") def bite(self): print("咬死你咬死你!!") def eat(self): print("有得吃,真满足^_^") def sleep(self): print("困了,睡了,晚安,Zzzz")
定义一个带列表类MyList,继承list,则列表的功能它都可以使用>>> class MyList(list): pass>>> list2 = MyList()>>> list2.append(5)>>> list2.append(6)>>> list2.append(1)>>> list2[5, 6, 1]>>> list2.sort()>>> list2[1, 5, 6]
要求:在类定义的时候,将self写入到第一个参数
Python的self其实就相当于C++的this指针。由同一个类可以生产无数对象,当一个对象的方法被调用的时候,对象会将自身的引用作为第一个参数传给该方法,那么python就知道需要操作哪个对象的方法了。
eg:
>>> class Ball: def setName(self,name): self.name = name def kick(self): print('我叫%s,该死的,谁踢我。。。' % self.name) >>> a = Ball()>>> a.setName('球A')>>> b = Ball()>>> b.setName('球B')>>> a.kick()我叫球A,该死的,谁踢我。。。>>> b.kick()我叫球B,该死的,谁踢我。。。
python的这些具有魔法的方法,总是被双下划线所包围,例如__init__(),即构造方法,也称构造函数,这个方法会在对象被创建时自动调用。其实,实例化对象时是可以传入参数的,这些参数会自动传入__init__()方法中,可以通过重写这个方法来自定义对象的初始化操作
eg:
>>> class Ball(): def __init__(self,name): self.name = name def kick(self): print('我叫%s,该死的,谁踢我。。。' % self.name) >>> b = Ball('小土豆')>>> b.kick()我叫小土豆,该死的,谁踢我。。。
>>> class Person: __name = '亦我飞也' def getName(self): return self.__name >>> p = Person()>>> p.__nameTraceback (most recent call last): File "", line 1, in p.__nameAttributeError: 'Person' object has no attribute '__name'>>> p.getName()'亦我飞也'
>>> p._Person__name'亦我飞也'
class DerivedClassName(BaseClassName):
>>> class Parent: def hello(self): print('正在调用父类的方法。。。') >>> class Child(Parent): #子类继承父类 pass #直接往下执行>>> p = Parent()>>> p.hello()正在调用父类的方法。。。>>> c = Child()>>> c.hello()正在调用父类的方法。。。
import random as rclass 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): passclass Garp(Fish): passclass Shark(Fish): def __init__(self): Fish.__init__(self) ##(1)调用未绑定的父类方法,self是子类的实例对象 self.hungry = True def eat(self): if self.hungry: print('吃货的梦想就是天天有的吃') self.hungry = False else: print('太撑了,吃不下了!')Fish.__init__(self) ##(1)调用未绑定的父类方法,self是子类的实例对象其实就是>>>Fish.__init__(shark)>>>shark.move()我的位置是:3 6使用super函数(super函数会帮我们自动找到基类的方法,而且还自动为我们传入self参数)Fish.__init__(self) 改为super().__init__
class DerivedClassName(Base1, Base2, Base3):……实例:子类c同时继承基类Base1和基类Base2>>> class Base1: def fool1(self): print('我是fool1,我为Base1代言。。。') >>> class Base2: def fool2(self): print('我是fool2,我为Base2代言。。。') >>> class C(Base1,Base2): pass>>> c = C()>>> c.fool1()我是fool1,我为Base1代言。。。>>> c.fool2()我是fool2,我为Base2代言。。。
class Turtle: def __init__(self,x): self.num = xclass Fish: def __init__(self,x): self.num = xclass Pool: def __init__(self,x,y): self.turtle = Turtle(x) self.fish = Fish(y) def print_num(self): print('水池里一共有乌龟 %d 条,鱼 %d 条' % (self.turtle.num,self.fish.num))>>> pool = Pool(5,2)>>> pool.print_num()水池里一共有乌龟 5 条,鱼 2 条
class C: count = 0;>>> a = C()>>> b = C()>>> c = C()>>> print(a.count,b.count,c.count)0 0 0>>> c.count += 10>>> print(a.count,b.count,c.count)0 0 10>>> C.count += 100>>> print(a.count,b.count,c.count)100 100 10
>>> class C: def x(self): print('X-man') >>> c = C()>>> c.x()X-man>>> c.x = 1 #新定义对象c的一个x属性,并赋值为1>>> c.x1>>> c.x() #可见,方法x()已经被属性x给覆盖了Traceback (most recent call last): File "", line 1, in c.x()TypeError: 'int' object is not callable
>>> class BB: def printBB(): #缺少self,导致无法绑定具体对象 print('no zuo no die') >>> BB.printBB()no zuo no die>>> bb = BB()>>> bb.printBB() #出现错误原因是由于绑定机制,自动把bb对象作为第一个参数传入,实际:bb.printBB(bb)Traceback (most recent call last): File "", line 1, in bb.printBB()TypeError: printBB() takes 0 positional arguments but 1 was given
>>> class A: pass>>> class B(A): pass>>> issubclass(B,A)True>>> issubclass(B,B) #一个类被认为是其自身的子类True>>> issubclass(B,object) # object是所有类的基类True>>> class C: pass>>> issubclass(B,C)False
>>> issubclass(B,C) 注:第一个参数如果不是对象,则永远返回FalseFalse>>> b1 = B()>>> isinstance(b1,B)True>>> isinstance(b1,C)False>>> isinstance(b1,A)True>>> isinstance(b1,(A,B,C))True
>>> class C: def __init__(self,x=0): self.x = x >>> c1 = C()>>> hasattr(c1,'x') #注意,属性名要用引号括起来True
>>> class C: def __init__(self, x=0, y=1): self.x = x self.y = y>>> c1 =C()>>> getattr(c1, 'x')0>>> getattr(c1, 'y')1>>> getattr(c1, 'z')Traceback (most recent call last): File "", line 1, in getattr(c1, 'z')AttributeError: 'C' object has no attribute 'z'>>> getattr(c1, 'z', '您访问的属性不存在')'您访问的属性不存在'
>>> setattr(c1,'y','FishC')>>> getattr(c1,'y')'FishC'
>>> delattr(c1,'y')>>> delattr(c1,'Z')Traceback (most recent call last): File "", line 1, in delattr(c1,'Z')AttributeError: Z
>>> class C: def __init__(self,size =10): self.size = size def getSize(self): return self.size def setSize(self,value): self.size = value def delSize(self): del self.size x=property(getSize,setSize,delSize) >>> c = C()>>> c.x #调用getSize()10>>> c.x = 12 #调用x=property(getSize,setSize,delSize)>>> c.x12>>> c.size12>>> del c.x #删除属性x()>>> c.sizeTraceback (most recent call last): File "", line 1, in c.sizeAttributeError: 'C' object has no attribute 'size'
>>> class Rectangle: def __init__(self,x,y): self.x = x self.y = y def getPeri(self): return (self.x + self.y) * 2 def getArea(self): return self.x * self.y>>> rect = Rectangle(5,2)>>> rect.getPeri()14>>> rect.getArea()10
一般在需要进行初始化的时候才重写__ init__()方法。而且要记住该方法的返回值一定是None(或者也可以理解没有返回值)。
__new__(cls[, ...])>>> class CapStr(str): def __new__(cls,string): string = string.upper() return str.__new__(cls,string) >>> a = CapStr('hello world')>>> a'HELLO WORLD
>>> class C: def __init__(self): print('我是__init__方法,我被调用了...') def __del__(self): print('我是__del__方法,我被调用l...') >>> c1 = C() #创建对象c1我是__init__方法,我被调用了...>>> c2 = c1>>> c3 = c2>>> del c1>>> del c2>>> del c3 #删除c3时,对象c1才会彻底被删除(即没有标签指向对象c1时,其才会被回收),引用计数=0时被删除我是__del__方法,我被调用l...
转载地址:http://tliws.baihongyu.com/