类的命名空间&组合

类的命名空间◆类中的静态变量可以被类调用也可以被对象调用◆对不可变数据类型来说,类变量最好用类名操作
class Person:
    money = 0
mother = Person()
father = Person()
Person.money += 1000
Person.money += 1000
print(Person.money)

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

class Course:
    langauage = ‘Chinese‘
    def __init__(self,name,period,price,teacher):
        self.name =name
        self.period =period
        self.price =price
        self.teacher =teacher
    def func(self):
        pass
python = Course(‘python‘,‘six months‘,2000,‘Wang‘)
print(python.__dict__)
print(python.langauage)
Course.langauage = ‘English‘
print(Course.langauage)# English
print(python.langauage)# English
python.langauage = ‘阿拉伯‘
print(python.langauage)# 阿拉伯   没有修改类中的值而是在python这个对象的命名空间中增加了一项‘langauage‘: ‘阿拉伯‘
print(Course.langauage)# English
print(python.__dict__) # {‘name‘: ‘python‘, ‘price‘: 2000, ‘period‘: ‘six months‘, ‘langauage‘: ‘阿拉伯‘, ‘teacher‘: ‘Wang‘}

class Foo:
    count = 0
    def __init__(self):
        Foo.count += 1
f1 = Foo()
f2 = Foo()
print(f1.count)
print(f2.count)
f3 = Foo()
print(f3.count)

练习:创建一个对象,每实例化一个对象就计数。 最终所有对象都共享这个数据

绑定方法:◆只有对象调用类内的方法的时候才有绑定方法的概念,◆当对象调用类内的方法的时候就是把对象中的值传给这个方法的self,所以这个对象和这个方法就有了绑定关系
#普通函数
def func():pass
print(func)  #<function func at 0x0000023DFAD0E488>
# 类
class Foo:
    def func(self):
        print(‘func‘)
f1 = Foo()
print(Foo.func) # <function Foo.func at 0x0000023DFAD0E950>
print(f1.func) #对象调用方法 ,把f1的值传给self  f1和func发生了绑定
# <bound method Foo.func of <__main__.Foo object at 0x000001F5784E8780>>
print(f1) # <__main__.Foo object at 0x000001F5784E8780>

补充:导入包的过程,就相当于实例化一个对象,就会自动执行__init__.py文件
面向对象的三大特性 : 继承   多态   封装

组合 : 一个类的对象是另一个类对象的属性

如:alex.weapon 是 Weapon 类的对象  (alex.weapon 相当于 w)

# 狗
class Dog:
    def __init__(self,name,aggr,blood,kind):
        self.name = name
        self.aggr = aggr
        self.blood = blood
        self.kind = kind
    def bites(self,person):
        person.blood -= self.aggr
# 人
class Person:
    def __init__(self,name,aggr,blood,sex):
        self.name = name
        self.aggr = aggr
        self.blood = blood
        self.sex = sex
        self.money = 0
    def attack(self,dog):
        dog.blood -= self.aggr

    def get_weapon(self,weapon):
        # 首先判断玩家的money够不够买装备
        if self.money >= weapon.price:
            # 玩家买完武器之后money减少
            self.money -= weapon.price
            # 玩家有了武器
            self.weapon = weapon
            # 玩家的攻击力增加
            self.aggr += weapon.aggr
        else:
            print(‘余额不足,请先充值‘)
# 武器装备
class Weapon:
    def __init__(self,name,price,aggr,naijiudu):
        self.name = name
        self.price = price
        self.aggr = aggr
        self.naijiudu = naijiudu
    # 大招
    def hand18(self,person):
        if self.naijiudu > 0 : # 如果还有耐久度
            person.blood -= self.aggr * 2 # 被攻击的人的血就掉攻击者攻击力的两倍
            self.naijiudu -= 1  # 耐久度减一

alex = Person(‘alex‘,0.5,100,‘女‘)
jin = Dog(‘金老板‘,100,500,‘泰迪‘)
w = Weapon(‘打狗棒‘,998,100,3)
# alex 装备打狗棒
alex.money += 1000
alex.get_weapon(w)
print(alex.aggr) # 100.5
print(alex.weapon) # <__main__.Weapon object at 0x000001C8C55886A0>
# alex 攻击 金老板
alex.attack(jin)
print(jin.blood)  # 399.5
# alex使用大招攻击金老板
alex.weapon.hand18(jin)
print(jin.blood)  # 199.5

人狗大战升级版

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

class Ring:
    def __init__(self,outside_r,inside_r):
        self.outside_c = Cricle(outside_r) # Cricle(outside_r)是Cricle的对象,但是在这里是Ring类的属性
        self.inside_c = Cricle(inside_r)
    def area(self):
        return self.outside_c.area() - self.inside_c.area()
    def perimeter(self):
        return self.outside_c.perimeter() + self.inside_c.perimeter()
ring = Ring(20,10)
print(ring.area())
print(ring.perimeter())

栗子1:运用组合计算圆环的面积和周长

class Teacher:
    def __init__(self,name,age,sex,brithday):
        self.name = name
        self.age = age
        self.sex = sex
        self.brithday = brithday
        self.course = Course(‘alex‘,2000,‘six months‘)
class Course:
    def __init__(self,name,price,month):
        self.name = name
        self.price = price
        self.month = month

class Birthday:
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day

b = Birthday(2018,7,25)
alex = Teacher(‘alex‘,1,‘女‘,b)
print(alex.name)
print(alex.brithday.year)
print(alex.brithday.month)
print(alex.brithday.day)
print(alex.course.price)

栗子2:用组合创建一个老师类,有生日且生日是一个类




原文地址:https://www.cnblogs.com/twinkle-/p/10551431.html

时间: 2024-10-03 05:39:27

类的命名空间&组合的相关文章

Python学习之旅—面向对象进阶知识:类的命名空间,类的组合与继承

前言 上篇博客笔者带领大家初步梳理了Python面向对象的基础知识,本篇博客将专注于解决三个知识点:类的命名空间,类的组合以及面向对象的三大特性之一继承,一起跟随笔者老看看今天的内容吧. 1.类的命名空间 在上一篇博客中,我们提到过对象可以动态添加属性,一起来回忆下昨天的知识点,看如下的代码: class A: pass a = A() a.name = 'alex' print(a.name) 这里我们手动为a对象添加了一个属性name,然后直接打印可以得到a对象的名称.通过这个例子,我们可以

php类和命名空间介绍,成员方法和类方法,类的继承与方法重写

1. 类和命名空间的介绍 foo.php: <?php // require_once 'lib.php'; // $h = new Hello(); //类的实例 // $h->sayHello(); //实例访问类的方法s// $d = new Desktop();// $d-> work(); // require_once 'Apple/foo.php';  //foo.php的文件位置 // $h = new \jkxy\Hello(); //foo.php的命名空间,在Hel

[Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]

Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如果有理解不当敬请指正,欢迎大家把自己的方法拿出来分享.我们希望被引入的类应该达成一下两点: 在应用中的任这里输入代码意位置可以使用该类名或命名空间,而不用显式调用require()/include(). 利用Yii的autoloader,仅在类被调用时加载,以遵循Yii按需加载的原则,节省资源. 我

error C2825: &#39;_Iter&#39;: 当后面跟“::”时必须为类或命名空间 -- 原因可能是参数错误或者自定义函数名和库函数名冲突

今天运行程序的时候遇到了下面这个bug 1> B1020.cpp 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371): error C2825: '_Iter': 当后面跟“::”时必须为类或命名空间 1> e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(584): 参见对正在编译的类 模板 实例化“std::iterator_traits<_InIt&

20180724 (面向对象:类的命名空间和查询顺序丶组合)

一.类的名称空间 类名()  产生了一个含有对象指针的空间 先执行代码 从上向下执行 首先执行到class的时候,创建了一个Person类的空间,其中有静态变量和方法以及方法的内存地址 之后执行到p1 = Person()的时候,又创建了一个p1的实例空间,当还没读到括号里面的参数的时候,此时该实例空间里只有一个指示牌是指向Person类空间的 当执行到括号里面的内容的时候,此时实例空间里多了country = "菲律宾",name = "alex",age = 4

oop思维意识,类 模块命名空间,类扩展之继承 、组合、mixin三种模式

python的书都是讲怎么创建类怎么实例化对象,一般会用使用了,但还不具备这种编程意识.这是从python学习手册第四版节选出来的,书中说oop不仅是一种技术,更是一种经验.学习大神的看法,为什么需要oop意识.

TP框架 MODEL类和命名空间

1.获取系统常量信息 public function shuchu() { var_dump(get_defined_constants()); }2.跨控制器或跨模块调用 function diaoyong() { //跨控制器或跨模块调用用方法 //1.造对象调用 /*$sc=new IndexController(); $sc->index();*/ //2.使用TP框架的快捷方法A来创建控制器对象 //$sc=A("Admin/Main"); //前面的Admin是文件夹

tp框架之Model类与命名空间

1.获取系统常量信息 public function shuchu() { var_dump(get_defined_constants()); }2.跨控制器或跨模块调用 function diaoyong() { //跨控制器或跨模块调用用方法 //1.造对象调用 /*$sc=new IndexController(); $sc->index();*/ //2.使用TP框架的快捷方法A来创建控制器对象 //$sc=A("Admin/Main"); //前面的Admin是文件夹

python类继承和组合

在python3中所有类默认继承object,凡是继承了object的类都成为新式类,以及该子类的子类Python3中所有的类都是新式类,没有集成object类的子类成为经典类(在Python2中没有集成object的类以及它的子类都是经典类 继承式用来创建新的类的一种方式,好处是减少重复代码 class People: def __init__(self,name,age): self.name=name self.age=age def walking(self): print('%s is