Python基础(九)-面向对象二

一、静态属性,类方法,静态方法

1.1、静态属性

未使用静态属性之前:

class Room:
    def __init__(self,name,owner,width,length,heigh):
        self.name=name
        self.owner=owner
        self.width=width
        self.length=length
        self.heigh=heigh

    def cal_area(self):
        print(‘%s 住的 %s 总面积是%s‘ % (self.owner,self.name, self.width * self.length))
        # return  self.width * self.length

r1 = Room("room01","小二",10,10,10)
r1.cal_area()  #小二 住的 room01 总面积是100

@property ==>使用静态属性:

class Room:
    def __init__(self,name,owner,width,length,heigh):
        self.name=name
        self.owner=owner
        self.width=width
        self.length=length
        self.heigh=heigh

    @property  #使用静态属性
    def cal_area(self):
        # print(‘%s 住的 %s 总面积是%s‘ % (self.owner,self.name, self.width * self.length)) #TypeError: ‘NoneType‘ object is not callable
        return  self.width * self.length

r1 = Room("room01","小二",10,10,10)
print(r1.cal_area)  #100  ==>调用方式发生了改变
print(r1.width)   #10

1.2、类方法

当我们不想进行实例化,而需要直接获取类的属性时,可以使用类方法@classmethod

class Room:
    tag=1
    def __init__(self,name,owner,width,length,heigh):
        self.name=name
        self.owner=owner
        self.width=width
        self.length=length
        self.heigh=heigh

    @property
    def cal_area(self):
        # print(‘%s 住的 %s 总面积是%s‘ % (self.owner,self.name, self.width * self.length))
        return  self.width * self.length

    def test(self):
        print(‘from test‘,self.name)

    @classmethod  #类方法
    def tell_info(cls,x):
        print(cls)
        print(‘--》‘,cls.tag,x)  #print(‘--》‘,Room.tag)
    # def tell_info(self):
    #     print(‘---->‘,self.tag)

print(Room.tag)  #1
Room.tell_info(10)   #--》 1 10    #不需要进行实例化而直接获取类的属性

1.3、静态方法

类的工具包@staticmethod

class Room:
    tag=1
    def __init__(self,name,owner,width,length,heigh):
        self.name=name
        self.owner=owner
        self.width=width
        self.length=length
        self.heigh=heigh

    @property
    def cal_area(self):
        # print(‘%s 住的 %s 总面积是%s‘ % (self.owner,self.name, self.width * self.length))
        return  self.width * self.length

    @classmethod
    def tell_info(cls,x):
        print(cls)
        print(‘--》‘,cls.tag,x)#print(‘--》‘,Room.tag)
    # def tell_info(self):
    #     print(‘---->‘,self.tag)

    @staticmethod  #类的工具包,不与类绑定,也不与实例绑定
    def wash_body(a,b,c):  #可以不传参
        print(‘%s %s %s正在洗澡‘ %(a,b,c))

    def test(x,y):
        print(x,y)

print(Room.__dict__)   #==>‘wash_body‘: <staticmethod object at 0x000002BFB0BB4630>
r1=Room(‘room12‘,‘alex‘,100,100,100000)
print(r1.__dict__)    #{‘width‘: 100, ‘heigh‘: 100000, ‘length‘: 100, ‘name‘: ‘room12‘, ‘owner‘: ‘alex‘}

二、组合

定义一个人的类,人有头,躯干,手,脚等数据属性,这几个属性有可以是通过一个类实例化的对象,这就是组合

组合的用途:①做关联②小的组成大的

class Hand:
    pass

class Foot:
    pass

class Trunk:
    pass

class Head:
    pass

class Person:
    def __init__(self,id_num,name):
        self.id_num=id_num
        self.name=name
        self.hand=Hand()
        self.foot=Foot()
        self.trunk=Trunk()
        self.head=Head()
p1=Person(‘111111‘,‘AAA‘)
print(p1.__dict__)
#{‘name‘: ‘AAA‘, ‘foot‘: <__main__.Foot object at 0x00000273D44547B8>, ‘id_num‘: ‘111111‘, ‘trunk‘: <__main__.Trunk object at 0x00000273D44547F0>, ‘hand‘: <__main__.Hand object at 0x00000273D4454780>, ‘head‘: <__main__.Head object at 0x00000273D4454828>}

不建议使用的方式:

class School:
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr
        self.course_list=[]   #定义列表
    def zhao_sheng(self):
        print(‘%s 正在招生‘ %self.name)
class Course:
    def __init__(self,name,price,period):
        self.name=name
        self.price=price
        self.period=period

s1=School(‘oldboy‘,‘北京‘)
s2=School(‘oldboy‘,‘南京‘)
s3=School(‘oldboy‘,‘东京‘)

c1=Course(‘linux‘,10,‘1h‘)
c2=Course(‘python‘,10,‘1h‘)

s1.course_list.append(c1)
s1.course_list.append(c2)
print(s1.__dict__)

for course_obj in s1.course_list:
    print(course_obj.name,course_obj.price)

原文地址:https://www.cnblogs.com/hujinzhong/p/11487391.html

时间: 2024-10-21 16:56:57

Python基础(九)-面向对象二的相关文章

Day6 - Python基础6 面向对象编程

Python之路,Day6 - 面向对象学习 本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢? 你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色 1 2 3 4 5 6 7 8 9 10 11

Python基础09 面向对象的进一步拓展

Python基础09 面向对象的进一步拓展 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们熟悉了对象和类的基本概念.我们将进一步拓展,以便能实际运用对象和类. 调用类的其它信息 上一讲中提到,在定义方法时,必须有self这一参数.这个参数表示某个对象.对象拥有类的所有性质,那么我们可以通过self,调用类属性. class Human(object): laugh = 'hahahaha' def show_laugh(

python基础语法(二)

------------------------------------------接 Python 基础语法(一) -------------------------------------------- 2. 元组 tuple和list十分相似,但是tuple是不可变的,即不能修改tuple,元组通过圆括号中用逗号分割的项定义:支持索引和切片操作:可以使用 in 查看一个元素是否在tuple中.空元组():只含有一个元素的元组("a",) #需要加个逗号 优点:tuple比list

python基础篇(二)

python基础篇(二) if:else,缩进和循环控制 A:if的基础格式和缩进 B:循环判断 C:range()函数和len()函数 D:break,contiue和pass语句 for,while循环 函数基础 A:函数的定义和返回值 B:返回值的三种情况 C:函数的注释 函数的进阶(命名空间和作用域) A:内置命名空间 B:全局命名空间 C:局部命名空间 D:全局作用域 E:局部作用域 F:函数的嵌套和作用域链. G:函数名的本质 闭包 ?一:if:else和缩进 A:if的基础格式和缩

Python基础知识初识 (二)

Python基础知识初识 (二) 编码初识 1.ASCLL 计算机: 计算机存储文件,存储数据,以及将一些数据信息通过网络发送出去,存储发送数据什么内容?底层都是01010101 计算机创建初期,美国,是7位一段,但是发明者说为了拓展,留出一位,这样就是8位一段句.8位有多少种可能 ?256种 编码相当于密码本,最早的密码本: ASCII码:只包含:英文字母,数字,特殊字符. 0000 0001 : a 0000 0101 : b 8bit (位)== 1byte(字节) 'hello123':

python基础系列(二)----各数据类型的详细方法描述

python基础 一.整数 1 class int(object): 2 """ 3 int(x=0) -> int or long 4 int(x, base=10) -> int or long 5 6 Convert a number or string to an integer, or return 0 if no arguments 7 are given. If x is floating point, the conversion truncate

Python基础08 面向对象的基本概念

Python基础 面向对象的基本概念 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢逆水寒龙,topmad和Liqing纠错 Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程. 面向对象的最主要目的是提高程序的重复使用性.我们这么早切入面向对象编程的原因是,Python的整个概念是基于对象的.了解OOP是进一步学习Python

Python基础(Django二)

本篇内容接上篇Python基础(Django) 六.Form 说明:Django中的From有两种功能,一是将自己显示成HTML,二是校验数据. 个人认为显示成HTML这个功能不太方便,因为显示样式不太好调整,建议只使用Form的校验数据的功能,所以这里对于样式的设置不做介绍,着重介绍校验数据的功能. Form的使用大概分为三个步骤: 首先定义一个类:类中的每一个字段都是Form的一个属性 然后根据类创建对象并定义校验方法:将创建的对象返回给前端的HTML页面引用,可生成相应的HTML代码.(同

python基础知识(二)

以下内容,作为python基础知识的补充,主要涉及基础数据类型的创建及特性,以及新数据类型Bytes类型的引入介绍

python基础之面向对象(二)

面向对象对程序设计OOD 找对象---->找类(归纳对象相同的特征与技能,还有没和对象独有的特征)面向对象编程OOP 先定义类---->实例化出对象查看成绩,交作业 在python3中,所有的类都是新式类class A:passprint(A.__bases__) 在python2中,新式类class B(object):passclass C(B):pass print(B.__bases__)print(C.__bases__) 在python中,经典类class D:passprint(