首页 > 代码库 > python类概论

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()


[root@CentOS6 ~]# 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__()

 

python类概论