一、上节回顾:

类:

对象

实例化:类()调用__init__方法产生一个对象的过程

类属性:静态属性,数据属性

方法:动态属性,函数属性

初始化方法:__init__

self:在一个类里表示对象本身

对象调用对象属性、方法

类调用静态属性

作业讲解:

1、小明和老李的故事

class Person:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def cutfirewood(self):
        print("%s,%s岁,%s,上山去砍柴"%(self.name,self.age,self.sex))
    def drivertodb(self):
        print("%s,%s岁,%s,开车去东北"%(self.name,self.age,self.sex))
    def lovedbj(self):
        print("%s,%s岁,%s,最爱大保健"%(self.name,self.age,self.sex))
ming=Person("小明",10,"boy")
ming.cutfirewood()
ming.drivertodb()
ming.lovedbj()
alex=Person("老李",90,"")
alex.cutfirewood()
alex.drivertodb()
alex.lovedbj()
类与实例化对象

2、圆的周长与圆的面积

from math import pi
class Circle:
    def __init__(self,r):
        self.radius=r
    def perimeter(self):
        return 2*pi*self.radius
    def area(self):
        return pi * (self.radius**2)
c1=Circle(10)
print(c1.perimeter())
print(c1.area())
圆与圆的周长面积

二、新内容(属性,组合,继承)

1、属性的介绍:

属性:静态属性(直接和类名关联或者直接定义在class下的变量)

   对象属性(在类内和self关联,在类外和对象名关联的变量)

   动态属性(函数)

说明:

(1)

(2)只有自己的发生了变化

(3)都发生了变化

class Foo:
    country="china"
    country_lst=["china"]
    def __init__(self,name):
        self.name=name
alex=Foo("alesander")
egg=Foo("egon")
print(Foo.country)  #china
print(alex.country) #china
print(egg.country)     #china
alex.country='印度'
print(alex.country)   #印度
print(egg.country)     #china
print(Foo.country)  #china
del alex.country  #恢复指针指向
print(alex.country) #china
print(alex.country_lst)   #['china']
alex.country_lst.append("印度")   #都发生了变化
print(alex.country_lst)   #['china', '印度']
print(egg.country_lst)      #['china', '印度']
print(Foo.country_lst)      #['china', '印度']
程序过程

2、总结:

  类名操作变量 不管操作可变还是不可变数据类型,都是类中对应的变量发生变化

  对象名操作静态变量

  引用变量:现在自己的命名空间中查找,找不到就去类的命名空间去找

  修改变量:

  如果是对可变数据类型中的元素进行修改,那么全局生效

  如果是对变量进行重新赋值,那么只是在对象自己的命名空间增加了一个新的属性

 面试题:

设计对象一个类,统计这个类被实例化的次数,且所有的对象共享这个属性

class Foo:
    count=0
    def __init__(self):
        Foo.count+=1
f=Foo()
f2=Foo()
f3=Foo()
print(f.count)  #3
print(f2.count) #3
print(f3.count) #3
# 总结:执行一次count才能在自己的命名空间增加

3、新问题

对象可以使用类的

 4、组合

(1)什么叫做组合

class Teacher:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
class Birthday:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
birthday1=Birthday(1968,12,31)
boss_gold=Teacher("太亮",40,"不详")
boss_gold.birth=birthday1
print(boss_gold.birth.year)   #1968
#将一个类的对象拥有的属性,再将其定义成一个类似提高代码的复用
组合的例子(老师和生日)
class Teacher:
    def __init__(self, name, age, sex, year, month, day):
        self.name = name
        self.age = age
        self.sex = sex
        self.birth = Birthday(year, month, day)
class Birthday:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
# birthday1=Birthday(1968,12,31)
boss_gold=Teacher("太亮",40,"不详",1968,12,31)
# boss_gold.birth
print(boss_gold.birth.year)   #1968
例二 (第二种方法)

(2)小练习

from math import pi
class Circle:
    def __init__(self,r):
        self.radius=r
    def perimeter(self):
        return 2*pi*self.radius
    def area(self):
        return pi*(self.radius**2)
class Ring:
    def __init__(self,outer_r,inner_r):
        self.outer_circle=Circle(outer_r)
        self.inner_circle=Circle(inner_r)
    def perimeter(self):
        return self.outer_circle.perimeter()+self.inner_circle.perimeter()
    def area(self):
        return self.outer_circle.area()-self.inner_circle.area()
ring1=Ring(20,10)
print(ring1.perimeter())
圆环的面积和周长

人狗大战的拓展:

class Dog:
    def __init__(self,name,breed,aggressiving,life_value):
        self.name=name
        self.breed=breed
        self.aggressiving=aggressiving
        self.life_value=life_value
    def bite(self,people):
        people.life_value-=self.aggressiving
class Person:
    def __init__(self,name,aggressiving,life_value,money):
        self.name=name
        self.aggressiving=aggressiving
        self.life_value=life_value
        self.money=money
    def attack(self,dog):
        dog.life_value-=self.aggressiving
    def get_weapon(self,weapon_obj):
        if self.money>weapon_obj.price:
            self.money-=weapon_obj.price
            self.weapon=weapon_obj
            self.aggressiving+=weapon_obj.aggr
class Weapon:
    def __init__(self,name,price,aggr):
        self.name=name
        self.price=price
        self.aggr=aggr
dgb=Weapon("打狗棒",99.8,100)
boss_gold=Person("金老板",5,250,100)
huang=Dog("大黄","藏獒",100,3000)
boss_gold.get_weapon(dgb)
boss_gold.attack(huang)
print(huang.life_value)
人狗大战拓展

 

5、继承:多继承和单继承

(1)继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类

   父类又可称为基类或超类,新建的类称为派生类或子类

(2)查看继承的类

print(Dog.__bases__)
# (<class 'object'>,)
单继承:
class
Person: pass class Dog(Person): pass print(Dog.__bases__) # (<class '__main__.Person'>,)
多继承
class Person:
    pass
class Weapon:
    pass
class Dog(Person,Weapon):
    pass
print(Dog.__bases__)
# (<class '__main__.Person'>, <class '__main__.Weapon'>)

(3)总结

两个类中有相同的代码:

    继承:把相同的代码放在父类中,子类的对象在子类中没有找到方法的时候,使用父类的

单继承和多继承

父类 超类  基类

子类 派生类

抽象和继承