面向对象1

1,类和对象

python中一切皆为对象,类型的本质就是类。

>>> dict #类型dict就是类dict
<class 'dict'>
>>> d=dict(name='eva') #实例化
>>> d.pop('name') #向d发一条消息,执行d的方法pop
'eva'

在python中,用变量表示特征,用函数表示技能(方法),因而具有相同特征和技能的一类事物就是'类',对象则是这一类事物中具体的一个。

1.1类

class 类名:

#创建一个类
class Preson:
    pass


class Preson:
    role =“peron”    #静态属性
    def walk(self):     #方法,动态属性
        print"person is walking..."

类的两种作用:属性引用,实例化

# class Person:                 # 类名
#     country = 'China'         # 创造了一个只要是这个类就一定有的属性
#                                # 类属性 静态属性
#     def __init__(self,*args):  # 初始化方法,self是对象,是一个必须传的参数
#         # self就是一个可以存储很多属性的大字典
#         self.name = args[0]   # 往字典里添加属性的方式发生了一些变化
#         self.hp = args[1]
#         self.aggr = args[2]
#         self.sex = args[3]
#
#     def walk(self,n):         # 方法,一般情况下必须传self参数,且必须写在第一个
#                               # 后面还可以传其他参数,是自由的
#         print('%s走走走,走了%s步'%(self.name,n))
#
# # print(Person.country)        # 类名 可以查看类中的属性,不需要实例化就可以查看
# alex = Person('狗剩儿',100,1,'不详')  # 类名还可以实例化对象,alex对象   # 实例化
# # print(alex.__dict__) # 查看所有属性
# print(alex.name)  # 查看属性值
# # print(alex.hp)  # 查看属性值
# alex.walk(5)    # Person.walk(alex,5)  # 调用方法 类名.方法名(对象名)

关于self:在实例化是自动讲对象/实例本身传给__init__的第一个参数,可以换名字。

1.2对象

对象=类名()

对象是关于类而实际存在的一个例子,对象/实例只有一种作用:属性引用

调用的固定模式:

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   #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

1.3对象之间的交互

# class Dog:
#     def __init__(self,name,blood,aggr,kind):
#         self.name = name
#         self.hp = blood
#         self.aggr = aggr
#         self.kind = kind
#     def bite(self,person):
#         # 狗咬人,人掉血
#         person.blood -= self.aggr
# class Person:
#     def __init__(self,name,blood,aggr,sex):
#         self.name = name
#         self.blood = blood
#         self.aggr = aggr
#         self.sex = sex
#     def attack(self,dog):
#         dog.hp -= self.aggr
#         if dog.hp <= 0:
#             print('%s打了%s,%s被打死了,扑街~~~'%(self.name,dog.name,dog.name))
#         else:
#             print('%s打了%s,掉了%s血'%(self.name,dog.name,self.aggr))
# jin = Dog('金老板',100,20,'teddy')
# # print(jin.name)
# alex = Person('alex',999,998,'不详')
# jin.bite(alex)   # Dog.bite(jin,alex)
# print(alex.blood)
# # alex attack
# alex.attack(jin)  # Person.attack(alex,jin)
# print(jin.hp)
人狗之战

2,类和对象命名空间

类里可以定义两种属性:静态属性。动态属性

创建一个类就会创建一个类的名称空间,用来存储类中定义的名字,这些名字称为类的属性

创建一个对象就会创建一个对象的名称空间。存放对象/实例的名字,称为对象/实例的属性

类中的静态变量可以被对象和类调用

对于不可变数据类型来说,类变量最好用类名操作,

对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的

# 类里的名字有 类变量(静态属性量)+ 方法名(动态属性)
# 对象里的名字 对象属性
# 对象 —— > 类
# 对象找名字 : 先找自己的 找类的 再找不到就报错
# 对象修改静态属性的值
    # 对于不可变数据类型来说,类变量最好用类名操作
    # 对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的
class Course:
    language=["Chinese"]                                              #language="Chinese"
    def __init__(self,teacher,course_name,period,price):
        self.teacher=teacher
        self.course_name=course_name
        self.period=period
        self.price=price
    def func(self):
        pass
Course.language[0]="df"                                           #Course.language="df"  
linux=Course("egon","py","6 months",20000)            #print(linux.language)
print(linux.language)                                                   #print(Course.language)
print(Course.language)
linux.language[0]="hu"                                              #linux.language="hu"
print(linux.language)                                                  #print(linux.language)
print(Course.language)                                                #print(Course.language)   
#  ['df']                                                                     #df
['df']                                                                           df             
 ["hu"]                                                                         du             
 ["hu"]                                                                          df            
                                                                                                   
View Code

2.2绑定方法

# def func():pass
# print(func)
#
# class Foo:
#     def func(self):
#         print('func')
#     def fun1(self):
#         pass
# f1 = Foo()
# print(Foo.func)
# print(f1.func)
# print(f1.fun1)
#<bound method Foo.func of f1
# 包 —— __init__
# import package —— 类的实例化的过程
# import time
# time.time()

2.3组合

组合:一个对象的属性值是另外一个类的对象(在一个类中以另外一个类的对象作为数据属性,称为类的组合)

什么时候用:当类之间有显著不同,并且较小的类是较大类所需要的组件时,用组合。(什么是什么)

 

#圆环的面积
# from math import pi
# class Circle:
#     def __init__(self,r):
#         self.r=r
#     def area(self):
#         return self.r**2*pi
#     def perimeter(self):
#         return 2*pi*self.r
# class Ring:
#     def __init__(self,out_r,ins_r):
#         self.out_c=Circle(out_r)
#         self.ins_c=Circle(ins_r)
#     def area(self):
#         return self.out_c.area()-self.ins_c.area()
#     def perimerter(self):
#         return self.out_c.perimeter()+self.ins_c.perimeter()
# ring=Ring(20,10)
# print(ring.area())
# print(ring.perimerter())
圆环的面积
# class Birthday:
#     def __init__(self,year,month,day):
#         self.year=year
#         self.month=month
#         self.day=day
# class Course:
#     def __init__(self,cou_name,period,piric):
#         self.name=cou_name
#         self.period=period
#         self.piric=piric
# class Teacher:
#     def __init__(self,name,age,sex,birthday):
#         self.name=name
#         self.age=age
#         self.sex=sex
#         self.birthday=birthday
#         self.course = Course('python', '6 month', 2000)
# b=Birthday(2020,2,13)
# egg=Teacher("egon",0,"女",b)
# print(egg.name)
# print(egg.sex)
# print(egg.birthday.day)
# print(egg.course.piric)
View Code

 

posted @ 2018-01-25 09:50  一种清孤不等闲  阅读(135)  评论(0编辑  收藏  举报
Live2D