面向对象设计

类:把一类事物的相同的特征和动作整合到一起就是类

  类是一个抽象的概念

对象:就是基于类而创建的一个具体的事物(具体的存在),

   也是特征和动作整合到一起

对象是由类产生的

实例化:由类生产对象的过程叫实例化,类实例化的结果就是一个对象,或者叫做一个实例

学校类:

特征:name,addr,type

动作:考试,招生,开除

def school(name,addr,type):
    def init(name, addr, type):
        sch = {
            'name': name,
            'addr': addr,
            'type': type,
            'kao_shi': kao_shi,
            'zhao_sheng': zhao_sheng
        }
        return sch

    def kao_shi(school):
        print('%s 学校正在考试' %school['name'])

    def zhao_sheng(school):
        print('%s %s 正在招生'%(school['type'],school['name']))


    return init(name,addr,type)

s1=school('oldboy','沙河','私立')
print(s1)
s1['zhao_sheng'](s1)

运行结果:

{'name': 'oldboy', 'addr': '沙河', 'type': '私立', 'kao_shi': <function school.<locals>.kao_shi at 0x00852030>, 'zhao_sheng': <function school.<locals>.zhao_sheng at 0x00852078>}
私立 oldboy 正在招生

面向对象设计(Object oriented design):将一类具体事物的数据和动作整合到一起

OOD不会特别要求面向对象编程语言,事实上,OOD可以由纯结构化语言来实现(比如C)

面向对象编程(object-oriented programming):用定义类+实例/对象的方式去实现面向对象设计(用类的特殊语言实现OOD)

#用面向对象编程独有的语法class去实现面向对象设计
class Dog:
    def __init__(self,name,gender,type):
        self.name=name
        self.gender=gender
        self.type=type

    def bark(self):
        print('一条名字为[%s]的[%s],狂吠不止' %(self.name,self.type))

    def yao_ren(self):
        print('[%s]正在咬人' %(self.name))

    def chi_shi(self):
        print('[%s]正在吃屎' %(self.type))


dog1=Dog('alex','female','京巴')
print(dog1.__dict__)
# dog2=Dog('wupeiqi','female','腊肠')
# dog3=Dog('yuanhao','female','藏獒')
#
dog1.bark()
# dog2.yao_ren()
# dog3.chi_shi()

运行结果:

{'name': 'alex', 'gender': 'female', 'type': '京巴'}
一条名字为[alex]的[京巴],狂吠不止

 

类相关知识:

声明类:

'''
class 类名:
    ’类的文档字符串‘
    类体
'''
#我们创建一个类
class Data:
    pass

#用类Data实例化出一个对象d1
d1=Data()
print(Data)
print(d1)

<class '__main__.Data'>
<__main__.Data object at 0x011C8FF0>

 类是用来描述一类事物,是事物就要有属性,属性分为:

1.数据属性:就是变量

.2.函数属性:就是函数,在面向对象里通常称为方法

注意:类和对象均用点来访问自己的属性

 class Chinese:
    '这是一个中国人的类'
    party='共产——党'
    def sui_di_tu_tan():
        print('随地吐痰')

    def cha_dui(self):
        print('插队')

#本质上就是在Chinese.__dict__里找
print(Chinese.party)
Chinese.sui_di_tu_tan()

print(dir(Chinese))         #只查看属性列表
print(Chinese.__dict__)     #查看属性字典
print(Chinese.__dict__['party'])
Chinese.__dict__['sui_di_tu_tan']()

运行结果:

 ***
随地吐痰
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'cha_dui', 'party', 'sui_di_tu_tan']
{'__module__': '__main__', '__doc__': '这是一个中国人的类', 'party': '***', 'sui_di_tu_tan': <function Chinese.sui_di_tu_tan at 0x02785FA8>, 'cha_dui': <function Chinese.cha_dui at 0x027F2030>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>}
***
随地吐痰
class Chinese:
    '这是一个中国人的类'
    party='***'
    def sui_di_tu_tan():
        print('随地吐痰')

    def cha_dui(self):
        print('插队')

print(Chinese.__name__)     #类名
print(Chinese.__doc__)      #文档
print(Chinese.__base__)     #类的父类
print(Chinese.__bases__)
print(Chinese.__module__)   #类所在模块

# Chinese
# 这是一个中国人的类
# <class 'object'>
# (<class 'object'>,)
# __main__

对象相关知识:

class Chinese:
    '这是一个中国人的类'
    party='***'

    def __init__(self,name,age,gender):
        print('__init__函数开始运行')
        self.mingzi=name
        self.nianji=age
        self.xingbie=gender

    def sui_di_tu_tan():
        print('随地吐痰')

    def cha_dui(self):
        print('%s插队'%self.mingzi)

p1=Chinese('alex','20','female')        #类会自动运行__init__函数   实例化就是类名(),返回的是一个对象
print(p1)                                 #p1其实就是self
print(p1.__dict__)                        #p1的字典属性
print(p1.mingzi)                          #alex
# __init__函数开始运行
# <__main__.Chinese object at 0x00B84170>
# {'mingzi': 'alex', 'nianji': '20', 'xingbie': 'female'}
# alex
print(p1.party)                 #可以理解为函数的作用域,先在__init__函数里(自己的属性字典里)找,找不到再往上一层找
#实例对象可以访问到类属性         #***


Chinese.sui_di_tu_tan()          #随地吐痰
Chinese.cha_dui(p1)              #alex插队

# p1.sui_di_tu_tan()
#报错:实例调用类的方法时,python会自动把实例对象p1作为参数传给函数
#     p1.sui_di_tu_tan()
# TypeError: sui_di_tu_tan() takes 0 positional arguments but 1 was given

p1.cha_dui()                #alex插队

 

posted @ 2019-03-19 12:04  wind_y  阅读(149)  评论(0编辑  收藏  举报