面向对象进阶:命名空间和组合

面向对象的命名空间

属性:静态属性(直接和类名关联的对象或者直接定义在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
Foo.role = ‘Person‘
print(Foo.country)
print(alex.name)
print(egg.name)
print(alex.country)
print(alex.role)
alex.country = ‘印度‘
print(alex.country)  # 印度
print(egg.country)  # China
print(Foo.country)  # China
del alex.country
alex.country_lst.append(‘印度‘)
print(alex.country_lst)  # [‘China‘, ‘印度‘]
print(egg.country_lst)  # [‘China‘, ‘印度‘]
print(Foo.country_lst)  # [‘China‘, ‘印度‘]

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

class Foo:
    count = 0
    def __init__(self):
        Foo.count += 1

f1 = Foo()
f2 = Foo()
print(f1.count)

对象使用名字的顺序:先用自己的,再用类的
对象可以使用类的
而类无法使用对象的

组合

组合:什么有什么的关系
一个对象的属性是另外一个类的对象

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
boss_gold.birth.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)

圆和圆环

from math import pi
class Circle:
    def __init__(self,r):
        self.r = r
    def perimeter(self):
        return pi*self.r*2
    def area(self):
        return pi*self.r*self.r

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 = Ring(10,5)
print(r1.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,person):
        person.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)
# 人有武器——组合
class Weapon:
    def __init__(self,name,price,aggr):
        self.name = name
        self.price = price
        self.aggr = aggr
dgb = Weapon(‘打狗棒‘,99.8,100)
boss_gold.get_weapon(dgb)

继承

继承:至少两个类 什么是什么的关系,为了避免几个类之间有相同的代码
父类: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,person):
        person.life_value -= self.aggressivity
class Person(Animal):
    def attack(self,dog):
        dog.life_value -= self.aggressivity

huang = Dog(‘大黄‘,100,3000)  # __init__ 找父类
boss_gold = Person(‘金‘,10,100)

查看继承的类

print(Dog.__bases__)  # (<class ‘__main__.Animal‘>,)
print(Animal.__bases__)  # (<class ‘object‘>,)

python两种类:经典类 新式类
python3 所有类都是新式类——都默认继承object class Animal(object): == class Animal:
python2 经典类和新式类并存:
class Animal: 经典类 —— 继承顺序 个别使用方法
class Animal(object): 新式类

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

class ParentClass1: #定义父类
    pass

class ParentClass2: #定义父类
    pass

class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass

父类 超类 基类
子类 派生类
抽象和继承

时间: 2024-07-31 01:51:20

面向对象进阶:命名空间和组合的相关文章

python面向对象之命名空间及组合

命名空间 类的静态属性不能通过__dic__方法进行修改,但是可以通过 类名.属性的方式修改 class Course: # 定义了一个课程类 language = 'chinese' # 有一个语言静态属性 def __init__(self,teacher,name,period,price): # ----init__方法有老师,课程名称,周期,价格等 self.teacher = teacher self.name = name self.period = period self.pri

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.coun

python-面向对象的命名空间和组合

面向对象的命名空间 # 属性:静态属性,(直接和类名关联或者直接在class下的变量) # 对象属性(在类内和self关联,在类外和对象名关联的变量) # 动态属性(函数,方法) # # class Foo: # country = 'China' # country_lst = ['China'] # def __init__(self,name): # self.name = name # # # alex = Foo('alexander') # egg = Foo('egon') # p

Python基础-面向对象进阶

面向对象进阶 一 类中的装饰器方法  classmethod staticmethod property 1.1 property 一般情况下,方法都是动词.指某一类事物的动作 在计算圆形的周长和面积的时候,他们应该是圆形的属性,但是这里确是一个方法.这不符合python面向对象(能够完全区分属性和方法)的理念. 所以我们可以用一个装饰器去将一个属性性质的函数,装饰成一个属性.可以以调用属性的方式去调用他. from math import pi class Circle: def __init

面向对象进阶小结

面向对象进阶小结 一.面向对象进阶小结 面向对象最本质解决的问题就是:提供可扩展性 类与对象:程序中必须现有类,再有对象 类中有属性,有方法 绑定方法:定义在类内部,没有装饰器装饰的方法都是对象的绑定方法,需要对象来调用,对象调用的时候,会把自身传入 1.1 类的继承 继承父类,则会有父类的所有属性和方法 class ParentClass1(): pass class ParentClass2(): pass class SubClass(ParentClass1,ParentClass2):

Python之路【第八篇】:Python基础(24)——面向对象进阶

参考连接: Python 面向对象(初级篇) http://www.cnblogs.com/wupeiqi/p/4493506.html python 面向对象(进阶篇) http://www.cnblogs.com/wupeiqi/p/4493506.html python 面向对象及相关 http://www.cnblogs.com/wupeiqi/articles/5017742.html 面向对象进阶: 类成员之字段.方法.属性: 类成员修饰符: 类成员之特殊成员 1.类方法 普通的方法

2Python全栈之路系列之面向对象进阶及类成员

Python全栈之路系列之面向对象进阶及类成员 再次了解多继承 先来一段代码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ class A:     def bar(self):         print("BAR")         self.f1()          class B(A):     def f1(self):         print("B")          class C:     def 

Python【day7】:Python学习(面向对象进阶、反射、socket介绍)

面向对象进阶 1.类变量和实例变量 # 一.变量 # 变量包括:实例变量和类变量, # 他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, # 实例变量属于对象 # 类变量属于类 class Province(object): country = "中国" #类变量 def __init__(self, name): self.name = name # 实例变量 # 直接访问实例变量(实例名来调用) obj = Province('河北省') print(obj.na

Python面向对象进阶和socket网络编程-day08

写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self,name): self.name=name p = Chinese('standby') # 实例化一个对象 print(p) # 打印这个对象 --- <__main__.Chinese object at 0x0000000000B3A978> - 示例2: >&g