面向对象

1.定义类

class Person:
    """
    定义类 Person
    """
    # 属性
    #构造方法,初始化对象
    def __init__(self):
        self.name="tom"
        self.age=20
        self.gender=u""
    # str toString()方法
    def __str__(self):
        return "name:%s"%self.name
    # 方法
    def say(self):
        print("saying...")

 

 

2.实例化对象

 

3. 隐藏属性 【属性私有化】 set,get

class Dog:
    def __init__(self,name):
        self.__name=name
    def __str__(self):
        str="[name:%s]"%(self.__name)
        return str
    
    def set_name(self,name):
        self.__name=name
    def get_name(self):
        return self.__name

 

  将属性名称命名为:__name,即该属性被私有化了,不能通过对象直接访问。

4.私有方法

__methodName()

 

5.__del__方法:【析构函数】

class Dog:
    def __init__(self,name):
        self.__name=name
    def __str__(self):
        str="[name:%s]"%(self.__name)
        return str
    
    def set_name(self,name):
        self.__name=name
    def get_name(self):
        return self.__name

dog1=Dog("hei")
dog2=dog1
dog1.set_name("xiaohei")

 

  如果del dog1,仅仅是删除dog1的变量的指向;dog1指向的对象仍然存在,此时不会执行析构函数

  如果对象没有人引用了,即dog1,dog2都被删除【引用计数为0】,就会执行析构函数.

  如果程序退出,也会执行析构函数。

  计算引用计数:sys.getrefcount(object) 比实际多一个,传参时,生成一个新的变量

 

6.继承

定义:

class Animal:
    def eat(self):
        print("eating..")
    
    def play(self):
        print("playing..")


class Dog(Animal):
    def dark(self):
        print("dog eating...")

class Cat(Animal):
    def catch(self):
        print(u"抓老鼠...")

dog1=Dog()
dog1.eat()
dog1.dark()

cat1=Cat()
cat1.eat()

 

  

  多层继承:

class LangDog(Dog):
    def eatFood(self):
        print(u"狼行天下吃肉")

 

 

构造函数:

  调用父类的构造方法:

def __init__(self,grade,name,age):
    # Person.__init__(self,name,age)   ****
    super(Student,self).__init__(name,age)
    self.grade=grade

 

调用父类成员:

  方法:

class LangDog(Dog):
    def eatFood(self):
        print(u"狼行天下吃肉")
        #调用父类方法
        Dog.dark(self)    #父类名.方法名(self)
    
# super().dark() #python3
     Animal.eat(self) #父类的父类

私有成员【属性和方法】的继承:

  私有成员在子类中访问不到,必须通过公共接口访问。

  对于共有成员,子类完全继承【子类和子类对象都可以访问】

 

 7.多继承

   类默认继承object类(python3),

class A(object):
    def fun(self):
        print("method A ....")


class B:
    def fun(self):
        print("method B")

class Sub(B,A):
    aa=12

s=Sub()
s.fun()

  如果A、B中有相同的方法名,子类默认调用前面父类的方法

  方法解析顺序:查看某个类的成员的访问优先级(搜索)

    Sub.__mro__     python3

    import inspect

    inspect.getmro(Sub)     python2

(<class '__main__.Sub'>, <class __main__.B at 0x0000000004B67C48>, <class '__main__.A'>, <type 'object'>)

  在设计程序中,最好不要写重名函数,如果重名,应该使用 类名.方法

 

8.with

 with Person() as per:

  pass

使用with的类必须实现__enter__,__exit__方法

class MyResource(object):
    name = 'name'
    def __enter__(self):
        print('连接资源..')
        return self
    # exc_type
    # exc_val
    # exc_tb
    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_tb:
            print('exception..')
        else:
            print('no exception..')
        print('释放资源..')
        # with中发生了异常:如果返回false,with语句的外部会跑出异常
        return True

    def query(self):
        print('查询..')

with MyResource() as a:
    1/0
    a.query()

 

posted @ 2018-04-15 21:20  fight139  阅读(170)  评论(0编辑  收藏  举报