面向对象编程-进阶(python3入门)

一、property装饰器的使用

#property:将一个方法伪装成一个数据属性
#如果不用property装饰器的话,这个bmi值就需要用 obj.bmi() 来调取数值,这个看起来更像一个功能,而不像一个特征

#例1
# class People:
#     def __init__(self,name,height,weight):
#         self.name = name
#         self.height =height
#         self.weight = weight
#
#     @property
#     def bmi(self):
#         return self.weight / (self.height ** 2)
#
# obj = People(‘egon‘,1.8,70)
# print(obj.bmi)

#例2     如果不使用property装饰器,则取到name 需要使用obj.name() 这看起来更像一个函数
#推荐使用这种方法

# class People:
#     def __init__(self,name):
#         self.__name = name
#
#     @property   #访问某个属性的操作
#     def name(self):
#         return self.__name
#
#     @name.setter    #但凡被property装饰过的函数,才会出现.setter,该装饰器是用来 修改函数的值
#     def name(self,value):
#         if type(value) is not str:
#             print(‘必须是字符串类型‘)
#             return
#         self.__name = value
#
#     @name.deleter   #删除某一个属性
#     def name(self):
#         print(‘不可删除‘)
#
# obj = People(‘lich‘)
# # print(obj.name)
# print(obj.__dict__)
#
# obj.name = ‘egon‘
# print(obj.__dict__)
# # print(obj.name)
# # print(obj.__dict__)
# #
# #
# # del obj.name

#例3  property的古老使用方法(不推荐使用)
class People:
    def __init__(self,name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self,value):
        if type(value) is not str:
            print(‘必须str‘)
            return
        self.__name = value

    def del_name(self):
        del self.__name

    name = property(get_name,set_name,del_name)

obj = People(‘lich‘)
print(obj.name)

obj.name = ‘egon‘
print(obj.__dict__)

del obj.name
print(obj.__dict__)

property,setter,deleter

二、绑定方法和非绑定方法

定义和格式:

‘‘‘
绑定方法:
    特殊之处:绑定给谁就应该由谁来调用,会将调用者(点左边的就是调用者)当作第一个参数自动传入

    绑定对象的方法:类中定义的函数在没有被任何装饰器装饰的情况下,默认就是绑定给对象的
                绑定对象的方法应该由对象来调用,自动传入的是对象

    绑定类的方法:为类中定义的函数添加装饰器classmethod
                绑定类的方法应该由类来调用,自动传入的是类

非绑定方法
    特殊之处:无论类和对象谁来调用,都只是一个普通函数,没有自动传值的效果。

‘‘‘

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

    def tell_info(self):
        print(‘<%s:%s>‘%(self.name,self.age))

    @classmethod    #类来调用,会自动传入类,若对象来调用的话,仍然传入类
    def func1(cls):
        print(cls)

    @staticmethod
    def func2(a,b):
        print(‘==========>‘,a,b)

print(People.func1)
obj = People(‘egon‘,19)

print(obj.func1)
obj.func1()

obj.func2(‘obj1‘,‘obj2‘)
People.func2(‘people1‘,‘people2‘)

print(obj.func2)    #只是普通函数
print(People.func2) #只是普通函数

staticmethod,classmethod

使用场景与方法:

原文地址:https://www.cnblogs.com/lich1x/p/10128813.html

时间: 2024-11-12 23:27:42

面向对象编程-进阶(python3入门)的相关文章

Python基础-第七天-面向对象编程进阶和Socket编程简介

本篇内容: 1.面向对象编程进阶-静态方法 2.面向对象编程进阶-类方法 3.面向对象编程进阶-属性方法 4.面向对象编程进阶-特殊成员(内置方法) 5.面向对象编程进阶-反射 6.异常处理.断言 7.Socket编程简介 一.面向对象编程进阶-静态方法 1.静态方法的实现 通过@staticmethod装饰器可以把其装饰的方法变为一个静态方法: 变成静态方法后,形参中可以不用写self了.如果写了self,默认是不会把对象本身传递给self,需要手动传递: class Dog(object):

进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 要在类中使用静态方法,需在类成员函数前面加上@staticmethod标记符,以表示下面的成员函数是静态函数.使用静态方法的好处是,不需要定义实例即可使用这个方法.另外,多个实例共享此静态方法. 类方法 类方法与普通的成员函数和静态函数有不同之处,在接触的语言中好像也没见过这种语义,看它的定义: 

python面向对象编程进阶

python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 1 class Foo(object): 2 pass 3 4 class B

面向对象编程进阶版

isinstance(obj, cls)和issubclass(sub, super) isinstance(obj,cls)检查obj是否是类 cls 的实例化对象 issubclass(sub, super)检查sub类是否是 super 类的派生类 # isinstance(obj,cls)检查obj是否是类 cls 的实例化对象 class Foo(object): pass class Foo1(Foo): pass obj = Foo1() print(isinstance(obj,

Python7 - 面向对象编程进阶

本节内容: 面向对象高级语法部分 经典式 VS 新式类 静态方法,类方法,属性方法 类的特殊方法 反射 异常处理 Socket开发基础 面向对象高级语法部分 经典类 VS 新式类 先看一串代码: class A: def __init__(self): self.n = "A" class B(A): pass class C(A): def __init__(self): self.n = "C" class D(B, C): pass obj = D() pri

Python之路,Day8 - 面向对象编程进阶

本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #_*_coding:utf-8_*_ class A:     def __init__(self):

Python_Day8_面向对象编程进阶

本节内容: 面向对象高级语法部分异常处理 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 Socket开发基础 经典类vs新式类 classical vs new style: 经典类:深度优先 新式类:广度优先 super()用法 抽象接口 import abc class Alert(object):     '''报警基类'''     __metaclass__ = abc.ABCMeta     @abc.abstractmethod     def send(sel

Python之路,Day7 - 面向对象编程进阶

本节内容 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业开发一个支持多用户在线的FTP程序 面向对象高级语法部分 静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法什么是静态方法呢其实不难理解普通的方法可以在实例化后直接调用并且在方法里可以通过self.调用实例变量或类变量但静态方法是不可以访问实例变量或类变量的一个不能访问实例变量和类变量的方法其实相当于跟类本身已经没什么关系了它与类唯一的关联就是需要通过

C#面向对象编程进阶(一) ——实现栈

如何用C#编写一个栈类? 关键在于这样的一个类应该如何设计呢?首先要确立面向对象的编程思想,即类是对实体进行合理地抽象和建模,而这种思想将贯彻在我们编程的整个过程中.下面我们一步一步来做. 1.类方法签名初步设计 对于设计一个类而言我们应该由外而内的进行设计,首先考虑它对外部提供的接口,再去考虑其内部的安排.对于栈而言,最重要的外部特性就是压栈和弹栈,所以要设计两个方法Push和pop,对于压栈而言,压进去的元素存放在哪,所以就要用数组来开辟一段连续的存储空间来对栈进行顺序存储.所以初步设计如下