python面向对象之静态属性/静态方法/类方法/组合

#!/usr/bin/env python
# coding:utf-8

class Campus:

    def __init__(self,name,addr,type):
        self.Name = name
        self.Addr = addr
        self.Type = type

    def details(self):
        print("学样的详细信息, 名称:%s 地址:%s 类型:%s" %(self.Name,self.Addr,self.Type) )

c1 = Campus("南京大学","江苏南京","985")
print(c1.__dict__)
print(Campus.__dict__)  # 注意实例字典与类的字典的区别

c1.details()
Campus.details(c1)  # 使用类去调用方法时,需要传入具体的实例参数

#### 也推荐看看廖雪峰的教程: https://www.bilibili.com/video/av3803706?from=search&seid=6691387782253130457

#####
class Room:
    clr = ‘可选的,默认白色‘
    def __init__(self,name,owner,width,length,height):
        self.name = name
        self.owner = owner
        self.width = width
        self.length = length
        self.height = height

    def area(self):
        return self.width * self.length

    @property # 此装饰器就是负责把一个方法变成静态属性调用
    def space(self):
        return self.width * self.length * self.height

    @classmethod # 供类使用的方法,虽然实例也可以调用
    def colour(cls): # 此 cls 表示自动传递类名作为参数
        print("房间的色彩是",cls.clr)

    @staticmethod # 比喻为类的工具包. 只是名义上的归属类管理,不能使用类变量和实例变量
    def round(a,b):
        print("地板使用%s或%s"%(a,b))

    ## 静态属性既可以访问实例属性,又可以访问类的属性
    ##  类方法  不能访问到实例的属性
    ## 静态方法  不能访问类的属性,也不能访问实例的属性
    # self跟实例绑定, cls跟类绑定, @staticmethod 跟谁都不绑定

r1 = Room(‘公寓‘,‘alex‘,9,9,2)
r2 = Room(‘house‘,‘jerry‘,12,13,5)

print(r1.area())
print(r2.area())

print("空间:",r1.space)  # 调用方法不一样了,省掉括号
print("空间:",r2.space)  # @property的好处是封装一个属性, 使用时完全感知不到背后的逻辑

Room.colour() # 跟实例没有关系,只是类调用自己的函数. 类级别的操作.

Room.round(‘木板‘,‘瓷砖‘)
r1.round("牛皮","水泥")  # 类或实例都可以调用

## 学着学着感觉到累了, 就去B站找了下以前喜欢的视频:
## 砖家 "你不知道的西游记" https://www.bilibili.com/video/av3803706?from=search&seid=6691387782253130457
## 这个系列的解说真是精彩, 以前在UKu上看过, 强力推荐给刚入社会的年轻人们看看.

组合:

#!/usr/bin/env python
# coding:utf-8

# 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‘, ‘alex‘)
# print(p1.__dict__)

# ## 类的组合:组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
# ## 参考: http://www.cnblogs.com/linhaifeng/articles/7340153.html
class School:
    def __init__(self,name,addr):
        self.name = name
        self.addr = addr

class Course:
    def __init__(self,name,price,period,school):
        self.name = name
        self.price = price
        self.period = period
        self.school = school

class Teacher:
    def __init__(self,name,age,gender,):
        self.name = name
        self.age = age
        self.gender = gender

s1 = School("Mooc",‘北京‘)
s2 = School("Mooc",‘上海‘)
s3 = School("Mooc",‘线上‘)

msg = ‘‘‘
    1 xx学院 新校区
    2 xx学院 老校区
    3 xx学院 网络校区
‘‘‘

while True:
    print(msg)
    menu={
        ‘1‘:s1,
        ‘2‘:s2,
        ‘3‘:s3
    }
    choice = input("选择学校:")
    school_obj = menu[choice]

    n_name = input("课程名:")
    n_price = input("课程价格:")
    n_period = input("课程周期:")

    new_course= Course(n_name,n_price,n_period,school_obj)
    print("课程[%s]属于[%s]学校,费用[%s]" %(new_course.name,new_course.school.name,new_course.price))

虽然这些都是小练习,与实际生产还有很大差距,但是没有这些练习的熟练掌握,怎么能玩转实际生产呢?

继续!

抽象类与接口练习:

#!/usr/bin/env python
# coding:utf-8

import abc #利用abc模块实现抽象类(没错,就叫abc)

class All_file(metaclass=abc.ABCMeta): # 定义成基类
    @abc.abstractmethod  # 用装饰器的方式定义抽象方法,无需实现功能
    def read(self):
        pass # 基类方法不用实现 子类必须定义功能
    @abc.abstractmethod
    def write(self):
        pass

## 接口继承:就是定义了一个父类,规定了所有的子类必须实现父类的方法,但是父类不实现。并不是为了节省代码

## 子类继承时必须实现具体地实现基类规定的方法,不实现就办法实例化
class Disk(All_file):
    def read(self):
        print("disk read")

    def write(self):
        print("disk write")

class Mem(All_file):
    def read(self):
        print("mem read")

    def write(self):
        print("mem write")

class cdrom(All_file):
    def read(self):
        print("cd read")

    def write(self):
        print("burn cd")

cd1 = cdrom() # 如果 cdrom没有去实现write方法,实例化时就会报错

‘‘‘

参考: http://www.cnblogs.com/linhaifeng/articles/7340153.html

抽象类与接口

抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。

抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计
‘‘‘

原文地址:https://www.cnblogs.com/FHBIAO/p/10174505.html

时间: 2024-10-24 22:10:33

python面向对象之静态属性/静态方法/类方法/组合的相关文章

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

静态属性 静态属性就是数据属性,在函数属性上加装饰器@property,感官会认为是把函数属性转化成数据属性,运用类函数方法不需要加() 封装:把背后的操作逻辑隐藏起来,跟实例绑定 class Hhj: def __init__(self,name,age,face): self.name=name self.age=age self.face=face @property def test(self): print('我是%s 年纪是%s 长得%s' %(self.name,self.age,

typescript静态属性,静态方法,抽象类,多态

1 /* 2 1.vscode配置自动编译 3 4 1.第一步 tsc --inti 生成tsconfig.json 改 "outDir": "./js", 5 6 7 2.第二步 任务 - 运行任务 监视tsconfig.json 8 9 10 2.typeScript中的数据类型 11 12 typescript中为了使编写的代码更规范,更有利于维护,增加了类型校验,在typescript中主要给我们提供了以下数据类型 13 14 15 布尔类型(boolean

Python_静态属性、类方法、静态方法

1.静态属性我们知道类既有函数属性又有数据属性,实例只有数据属性,我们在使用实例调用类的函数属性并运行时,总要带上函数后面的括号才能运行,不然总是调用函数的内存地址,如下图所示: 问题:那么我们如何能像调用数据属性一样调用函数属性呢? 类中提供了@property关键字,可以看成@property是一个装饰器,装饰器的作用是调用类的函数属性key值时,直接来运行该key值对应的函数.像是调用类的属性一样来直接调用并运行类的函数,具体操作如:1.1加上@property关键字后,类的函数属性的不同

第二十八篇 静态属性、类方法、静态方法

静态属性 静态属性:实际上说的就是数据属性 需求:每个人都有自己的房子,想知道每个人自己的房子都有多大平米 实现分析:每个人,表示有很多人,不可能一个人写一次计算面积的方法,那么就可以将它提炼出来,放到类里 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

面向对象的静态属性和静态方法

一,静态属性 静态属性时该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量 定义静态属性:访问修饰符 static 静态属性名 静态属性的访问: 1.在类的内部 self::静态属性名 类名::静态属性名 2.类的外部 如果要在类的外部访问静态属性,静态属性需要时public,否则不能直接访问 访问形式是: 类名::静态属性名 $this和self的区别 1.使用的方式不同 $this-> self:: 2.self

第49天python学习静态属性 静态方法

#静态属性:就是数据属性#定义个房间类# class Room:# def __init__(self,name,owner,width,length,heigh):# self.name=name# self.owner=owner# self.length=length# self.width=width# self.heigh=heigh## r1=Room("房号1120","zhangshang",10,20,3)# print("%s住的%s房

Python 面向对象和实例属性

一.三大编程范式 编程范式即编程的方法论,标识一种编程风格. 我们学习完Python语法后,就可以写python代码了,然后每个人写代码的风格不同,这些不同的风格就代表了不同的流派. 如果把python的基本语法比作无数的基本功,那么不同的编程风格就好比不同的武林门派. 虽然大家风格不同,但是都可以完成你的编程需求,Python是一门面向对象编程语言,但是到目前为止,你从未接触面向对象编程,然而你已经可以解决很多问题了,在Python中并没有人强制你使用哪一种固定的风格. 根本就没有什么门派是天

php中静态属性静态方法的用法

static关键字用来修饰属性.方法,称这些属性.方法为静态属性.静态方法.static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法”. 如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“::”调用.static关键字可以用来修饰变量.方法.不需要经过实例化,就可以直接访问类中static的属性和static的方法.static 的属性和方法,只能访问static的属性和方法,不能类访问非静态的属性和方法.因

类的自动加载,静态属性静态方法

类的自动加载 function 完成类的自动加载    param: $clas_name 是类的名称    说明: 当程序员使用到一个未定义的类时,就会自动的触发__autoLoad这个函数, 该函数是系统提供的 静态变量是属于所有对象,可以被所有对象共享 静态变量与静态方法 静态属性是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. l  定义静态属性 访问修饰符 static 静态属性名;    stati