day24 面向对象,交互,组合,命名空间,初始继承

面向对象的命名空间:

#属性:静态属性 (直接和类名关联或者直接定义在class下的变量)
    # 对象属性 (在类内和self关联,在类外和对象名关联的变量)
    #  动态属性(函数)

class Foo:
    country = ‘China‘
    country_lst = [‘China‘]
    def __init__(self,name):
        self.name = name

alex = Foo(‘alexander‘)
egg = Foo(‘egon‘)
alex.age = 90
alex.country_lst = []
alex.country_lst.append(‘印度‘)
# print(Foo.country_lst)
# Foo.role = ‘Person‘
# print(Foo.country)
# print(alex.name)
# print(egg.name)
# Foo.country
# alex.country = ‘印度‘
# print(alex.country)
# print(egg.country)
# print(Foo.country)
# del alex.country
# print(alex.country)
# print(alex.country_lst)
# alex.country_lst.append(‘印度‘)
# print(alex.country_lst)
# print(egg.country_lst)
# print(Foo.country_lst)
#类名操作变量 不管操作可变还是不可变数据类型 都是类中对应的变量发生变化
#对象名操作静态变量
#引用变量:现在自己的命名空间中查找,找不到就去类的命名空间找
#修改变量:
# 如果是对可变数据类型中的元素进行修改,那么全局生效
# 如果是对变量进行重新赋值,那么只是在对象自己的命名空间里增加了一个新的属性
# 结论:应该尽量用类名去使用静态变量

# 设计一个类,统计这个类被实例化的次数,且所有的对象共享这个属性
# class Foo:
#     count = 0
#     def __init__(self):
#         Foo.count += 1
#
# f = Foo()
# f2 = Foo()
# f3 = Foo()
# print(f.count) #Foo.count
# print(f2.count) #Foo.count
# print(f3.count) #Foo.count

class Person:
    def __init__(self):pass
        #给一个什么属性都没有的对象赋一些初识的属性
    def eat(self):
        print(‘吃猪食‘)

alex = Person()  #裸着
print(alex.__dict__)
alex.name = ‘alexander‘
# alex.eat = ‘泔水‘  #对象使用名字的顺序:先用自己的,再用类的
# alex.eat()
#对象可以使用类的
#而类无法使用对象的
# print(Person.eat)
# print(alex.eat)  #类对象指针的东西  alex = {‘eat‘:eat}

组合:

#函数
#定义 调用 返回值 参数、命名空间和作用域

#面向对象
#定义 、命名空间
#三大特性:封装继承和多态(组合)

#组合 : 什么 有 什么 的关系
#一个对象的属性是另外一个类的对象
#老师有生日
# class Teacher:
#     def __init__(self,name,age,sex):
#         self.name = name
#         self.age = age
#         self.sex = sex
#         # self.birth_year = year
# class Birthday:
#     def __init__(self,year,month,day):
#         self.year = year
#         self.month = month
#         self.day = day
# birthay1 = Birthday(1968,12,31)
# boss_gold = Teacher(‘太亮‘,40,‘不详‘)
# boss_gold.birth = birthay1
# boss_gold.birth.year  #boss_gold.bith.year
#老师有生日 : 年月日
#将一个类的对象拥有的属性 再将其定义成一个类以提高代码的复用
# 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
# boss_gold = Teacher(‘太亮‘,40,‘不详‘,1968,12,31)
# print(boss_gold.birth)

#圆形类
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()
r1 = Circle(5)
print(r1.perimeter())
print(r1.area())
r = Ring(10,8)
print(r.perimeter())
print(r.area())
# 既能hold住圆形的问题
# 又能解决环形的问题
#10,20
# def func(arg1,arg2):
#     outer_circle = Circle(20)
#     inner_circle = Circle(10)
#     print(outer_circle.area() - inner_circle.area())
#
# def func2(arg1,arg2):
#     outer_circle = Circle(20)
#     inner_circle = Circle(10)
#     print(outer_circle.perimeter() + inner_circle.perimeter())
# # 500个环
# ring1 = Ring(20,10)
# ring1.area()
#思想 —— 技术

#面向对象 命名空间
#组合 : 老师有生日,环中有圆
#游戏 :组合

组合例题:

#狗
class Dog:  # 定义一个狗类
    def __init__(self, name, breed, aggressivity, life_value):
        self.name = name  # 每一只狗都有自己的昵称;
        self.breed = breed  # 每一只狗都有自己的品种;
        self.aggressivity = aggressivity  # 每一只狗都有自己的攻击力;
        self.life_value = life_value  # 每一只狗都有自己的生命值;

    def bite(self,people):
        people.life_value -= self.aggressivity
#人
class Person:  # 定义一个人类
    def __init__(self, name, aggressivity, life_value, money):
        self.name = name  # 每一个角色都有自己的昵称;
        self.aggressivity = aggressivity  # 每一个角色都有自己的攻击力;
        self.life_value = life_value  # 每一个角色都有自己的生命值;
        self.money = money

    def attack(self,dog):
        dog.life_value -= self.aggressivity

    def get_weapon(self,weapon_obj):
        if self.money > weapon_obj.price:
            self.money -= weapon_obj.price  # 金老板花钱买武器
            self.weapon = weapon_obj  # 金老板装备打狗棒
            self.aggressivity += weapon_obj.aggr  # 金老板的攻击力增加了

# boss_gold = Person(‘金老板‘,5,250,100)
# huang = Dog(‘大黄‘,‘藏獒‘,100,3000)
# huang.bite(boss_gold)
# print(boss_gold.life_value)
# boss_gold.attack(huang)
# print(huang.life_value)
#不公平
#武器装备
#人 有 武器 —— 组合
#武器:攻击力,名字,价格
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)

#游戏的组合
#人可以有装备 ——
#狗 ——

#组合和命名空间
#继承的一点知识

初识继承:

# 面向对象的三大特性之一 —— 继承
# 继承 :至少两个类 : 什么 是 什么 的关系,为了避免几个类之间有相同的代码
# 父类 : Animal
# 子类 : Dog、Person
#动物
class Animal:
    def __init__(self,name,aggressivity,life_value):
        self.name = name
        self.aggressivity = aggressivity
        self.life_value = life_value
#狗
class Dog(Animal):  # 定义一个狗类
    def bite(self,people):
        people.life_value -= self.aggressivity
#人
class Person(Animal):  # 定义一个人类
    def attack(self,dog):
        dog.life_value -= self.aggressivity

    def get_weapon(self,weapon_obj):
        if self.money > weapon_obj.price:
            self.money -= weapon_obj.price  # 金老板花钱买武器
            self.weapon = weapon_obj  # 金老板装备打狗棒
            self.aggressivity += weapon_obj.aggr  # 金老板的攻击力增加了
huang = Dog(‘大黄‘,100,3000)   #__init__ 找父类
print(huang.life_value)
boss_gold = Person(‘金老板‘,5,250)  #__init__ 自己没有 找父类
print(boss_gold.life_value)
# Dog.bite(Person)
print(Dog.__bases__)
print(Animal.__bases__)

#python 两种类:经典类 新式类
#python3 新式类 —— 都默认继承object class Animal(object): == class Animal:
#python2 经典类和新式类 并存
        #class Animal:  经典类 —— 继承顺序 个别使用方法
        #class Animal(object):  新式类
#两个类中有相同的代码,
# 继承:把相同的代码放在父类中,子类的对象在子类中没有找到方法的时候,使用父类的
# 单继承和多继承
# 父类 超类 基类
# 子类 派生类
# 抽象和继承

时间: 2024-08-29 02:44:18

day24 面向对象,交互,组合,命名空间,初始继承的相关文章

类命名空间与对象、实例的命名空间和下面向对象的组合用法

创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就是定义在类中的方法 其中类的数据属性是共享给所有对象的 而类的动态属性是绑定到所有对象的 创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性 在自己的名称空间里找,找不到就去类中找,类也找不到就去找父类...最后找不到就会抛出异常 面向对象的组合用法 软件重用的重要方式除了继承之外还有一种

day24 面向对象-继承

什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 继承是类中提供的一种新语法面向对象三大特性:封装 继承 多态继承:什么是什么的关系 他大舅打二舅都是他舅 高桌子低板凳都是木头 继承语法,单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是Par

C++ Primer 学习笔记_71_面向对象编程 --句柄类与继承

面向对象编程 --句柄类与继承 引言: C++中面向对象编程的一个颇具讽刺意味的地方是:不能使用对象支持面向对象编程,相反,必须使用指针或引用. void get_prices(Item_base object, Item_base *pointer, Item_base &reference){ //需要根据指针或引用实际所绑定的类型进行调用 cout<< pointer ->net_price(1)<< endl; cout<< reference.n

JavaScript 面向对象程序设计(下)&mdash;&mdash;继承与多态 【转】

JavaScript 面向对象程序设计(下)--继承与多态 前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员.公有实例成员.私有静态成员.公有静态成员和静态类的封装.这次我们来讨论一下面向对象程序设计中的另外两个要素:继承与多态. 1 又是几个基本概念 为什么要说又呢? 在讨论继承时,我们已经列出了一些基本概念了,那些概念是跟封装密切相关的概念,今天我们要讨论的基本概念,主要是跟继承与多态相关的,但是它们跟封装也有一些联系. 1.1 定义和赋值 变量定义是指用 var a;

面向对象的三大特性之继承

# 面向对象的三大特性之继承 # 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好 (如机器人) # 当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好 (动物--猫) # 继承同时有两种含义:1,继承基类的方法,并且做出自己的改变或扩展(代码重用),这种意义并不大,因为它使子类和基类出现强耦合 # 2,声明某个子类兼容于某基类.定义一个接口类,子类继承接口类,并实现接口中定义的方法 # 接口继承只是接口类规定了子类必须实现的方法,但是接口类里不去实现,子类

Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript时,可以选择面向过程的方式编程,显得高效:但在实际工作中,遇到的项目需求和框架较大的情况下,选择面向对象的方式编程显得尤其重要,Javascript原生语法中没有提供表述面向对象语言特性的关键字和语法(如extends.implement).为了实现这些面向对象的特性,需要额外编写一些代码,如下.

C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]

面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对象进行的调用的虚行为. 1.比較两个Sales_item对象 在编写函数计算销售总数之前,须要定义比較Sales_item对象的方法.要用Sales_item作为关联容器的keyword,必须能够比較它们.关联容器默认使用keyword类型的小于操作符,可是假设给Sales_item定义小于操作符,

面向对象的三大特性之继承-基础知识总结------彭记(05)

面向对象的三大特性之继承: js中的某些对象没有一些需要的属性和方法,但是另外的对象有,那么拿过使用,就是继承. js中继承的实现方式: 1.混入式继承:通过循环将一个对象中的所有属性和方法混入到另外一个对象中: var me={ work:function(){ console.log('敲代码'): } }: var mayun={ money:9999999, car:'000', manager:function(){ console.log('管理巴巴...'); } } /*遍历,让

java基础篇(二) ----- java面向对象的三大特性之继承

java面向对象的三大特性之继承: 复用代码是java众多引人注目的功能之一,但是想要成为极具革命性的语言,仅仅是复制代码并对其加以改变是不够的.它必须能够做更多的事.引自<Think in java>    而代码复用也是程序员一直不断追求的.由此来说下代码复用的一种方式 java面向对象的三大特性--继承!! 在面向对象程序设计中,继承机制可以有效地组织类的结构.确定类之间的关系,在已有类的基础上开发新的类.继承机制在程序代码复用.提高软件开发效率.降低软件系统维护成本等方面具有重要作用.