面向对象

面向对象

定义及调用的固定模式

class 类名:

    def __init__(self,参数1,参数2):

        self.对象的属性1 = 参数1

        self.对象的属性2 = 参数2

    def 方法名(self):pass

    def 方法名2(self):pass

对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西

                  #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法

                  #括号里传参数,参数不需要传self,其他与init中的形参一一对应

                  #结果返回一个对象

对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可

对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

 

面向对象的组合用法

组合:一个类的对象是另一个类的属性

class BirthDate:
    def __init__(self,year,month,day):

        self.year=year

        self.month=month

        self.day=day

class Couse:

    def __init__(self,name,price,period):

        self.name=name

        self.price=price

        self.period=period

class Teacher:

    def __init__(self,name,gender,birth,course):

        self.name=name
        self.gender=gender
        self.birth=birth
        self.course=course

    def teach(self):
        print('teaching')

 

p1=Teacher('egon','male',
            BirthDate('1995','1','27'),
            Couse('python','28000','4 months')
           )

print(p1.birth.year,p1.birth.month,p1.birth.day)

print(p1.course.name,p1.course.price,p1.course.period)
'''
运行结果:
1 27
python 28000 4 months
'''

面向对象的三大特征:继承,多态,封装

继承格式

class Animal:

    def __init__(self, name, aggressivity, life_value):

        self.name = name  

        self.aggressivity = aggressivity  

        self.life_value = life_value  

    def eat(self):

        print('%s is eating'%self.name)

class Dog(Animal):  #()中的是父类

    pass

class Person(Animal):

    pass

Super()

class A:

    def hahaha(self):

        print('A')

class B(A):

    def hahaha(self):

        super().hahaha()

        #super(B,self).hahaha()

        #A.hahaha(self)

        print('B')

 

a = A()

b = B()

b.hahaha()

钻石继承

 

 

多态

多态指的是一类事物有多种形态

动物有多种形态:人,狗,猪

 

import abcclass Animal(metaclass=abc.ABCMeta): #同一类事物:动物    @abc.abstractmethod

    def talk(self):

        pass

class People(Animal): #动物的形态之一:

    def talk(self):

        print('say hello')

class Dog(Animal): #动物的形态之二:

def talk(self):

        print('say wangwang')

class Pig(Animal): #动物的形态之三:

    def talk(self):

        print('say aoao')

 

封装

私有变量私有方法:方法变量前加双下划线,外部不能访问

property

property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

一个静态属性property本质就是实现了get,set,delete三种方法

class Foo:

    @property

    def AAA(self):

        print('get的时候运行我啊')

 

    @AAA.setter

    def AAA(self,value):

        print('set的时候运行我啊')

 

    @AAA.deleter

    def AAA(self):

        print('delete的时候运行我啊')

#只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter

f1=Foo()

f1.AAA

f1.AAA='aaa'del f1.AAA

Claseemethod(类方法) 

class Classmethod_Demo():

    role = 'dog'

 

    @classmethod

    def func(cls):

        print(cls.role)

 

Classmethod_Demo.func()

 

Staticmethod(静态方法) 

class Staticmethod_Demo():

    role = 'dog'

    @staticmethod

    def func():

        print("当普通方法用")

Staticmethod_Demo.func()

反射

class Foo:

    f = '类的静态变量'

    def __init__(self,name,age):

        self.name=name

        self.age=age

    def say_hi(self):

        print('hi,%s'%self.name)

 

obj=Foo('egon',73)

#检测是否含有某属性print(hasattr(obj,'name'))print(hasattr(obj,'say_hi'))

#获取属性

n=getattr(obj,'name')print(n)

func=getattr(obj,'say_hi')

func()

print(getattr(obj,'aaaaaaaa','不存在啊')) #报错

#设置属性

setattr(obj,'sb',True)

setattr(obj,'show_name',lambda self:self.name+'sb')print(obj.__dict__)print(obj.show_name(obj))

#删除属性

delattr(obj,'age')

delattr(obj,'show_name')

delattr(obj,'show_name111')#不存在,则报错

print(obj.__dict__)

 

item

__getitem____setitem____delattr__

class Foo:

    def __init__(self,name):

        self.name=name

 

    def __getitem__(self, item):

        print(self.__dict__[item])

    def __setitem__(self, key, value):

        self.__dict__[key]=value

    def __delitem__(self, key):

        print('del obj[key],我执行')

        self.__dict__.pop(key)

    def __delattr__(self, item):

        print('del obj.key,我执行')

        self.__dict__.pop(item)

f1=Foo('sb')

f1['age']=18

f1['age1']=19del f1.age1del f1['age']

f1['name']='alex'print(f1.__dict__)

 

posted @ 2019-03-31 21:05  pypypy  阅读(821)  评论(0编辑  收藏  举报