面向对象

类和对象:类是模版,对象是类创建出来的一个具体的存在

类的三要素:类名(单词首字母必须大写,单词间无下划线),属性,方法

使用名词提炼法来设计一个类

一)类的基础
dir(对象) 查看该对象的所有方法和属性

创建对象:类名()

初始化方法:
当使用类名创建对象时,会自动执行如下操作
1)为对象在内存中分配空间 __new__方法做的事情
2)为对象的属性设置初始值,也就是__init__方法做的事情。它是对象的内置方法。创建对象时,会自动执行初始化方法
即创建一个对象时,先执行new创建内存空间,然后执行init方法,为申请的空间初始化

__del__对象在销毁前,会被自动调用,如果想在销毁前做一些事情,可以重写此方法
__str__返回对象的描述信息,pirnt(对象)会打印对象的信息,如果想要自定义打印信息,可以重写此方法,但返回值必须是str

二)
面向对象特性———封装
通过需求分析提取属性和方法整合成一个类,即封装
在对象的方法内部,是可以直接访问和使用对象的属性的。

面向对象特性———继承
继承:不需要重写重复的代码
子类拥有父类的全部属性和方法,但不能直接使用父类的私有属性和方法
class 子类(父类):
继承的传递性:子类可以继承父类的父类的所有属性和方法

面向对象特性——多态
不同的子类对象调用相同得父类方法,产生不同的执行结果,
可以增加代码的灵活度,以继承和方法的重写为前提

三)特殊方法
1)类属性,类方法
实例,实例化,实例属性,实例方法
类是特殊的对象——类对象,在内存中只有一份

类属性定义——在类的下方使用赋值语句定义即可,访问类属性,使用类名.类属性。

类属性在内存中只有一份;实例属性在每个对象中都要保存一份。

类属性存储的内容是大家共有的。---那就定义成类属性。

类方法定义——-使用classmethod和cls来定义,

@classmethod

def 类方法(cls):
    
    pass

访问类方法,使用类名.类方法

2)静态方法
定义:既不需要访问类方法类属性,实例方法,实例属性时,可以定义此方法为静态方法
格式:需要staticmethod,但不需要传入self

@staticmethod  

def 静态方法():
    
    pass

访问静态方法: 类名.静态方法()

3) 实例方法,类方法,静态方法的选择
实例方法:方法内部访问实例属性,或者访问类属性时
类方法:方法内部只访问类属性
静态方法:不需要访问类属性和实例属性。

class Foo(object):

    #类属性
    country = 'China'

    #初始化方法
    def __init__(self, name):
        #实例属性
        self.name = name

    #实例方法
    def func(self):
        print(self.name)
        print('实例方法')

    #类方法
    @classmethod
    def cls_func(cls):
        print('类方法')

    #静态方法
    @staticmethod
    def static_fun():
        print('静态方法')

foo = Foo('shenzhen')

print(Foo.country)  #打印类属性
print(foo.name)     #打印实例属性

foo.func()       #调用实例方法
Foo.cls_func()   #调用类方法
Foo.static_fun() #调用静态方法

四)property属性
定义property属性有两种方式,分别是装饰器和类属性, 装饰器还分为经典类和新式类。

1)经典类--装饰器方式定义:在实例方法的上面加上@property装饰器,并且仅有一个self参数,然后调用时,不需要加括号。
2)新式类--装饰器方式定义:有三种访问方式,@property,@方法名.setter, @方法名.deleter
3)类属性方式定义:使用property方法,有四个参数,具体看例子说明。

一般是property属性内部进行一系列的逻辑计算,然后将计算结果返回。
目的是简化调用者的流程
eg:

经典类--装饰器

class Person(object):

    def __init__(self, name):
        self.name = name

    @property
    def age(self):
        return 18

xiaoming = Person('xiaoming')
print(xiaoming.age)

新式类--装饰器

class Person1(object):

    def __init__(self, name):
        self.name = name

    @property
    def age(self):
        print('property')

    @age.setter
    def age(self, value):
        print('age.setter')

    @age.deleter
    def age(self):
        print('age.deleter')

xiaoming1 = Person1('xiaoming1')
xiaoming1.age
xiaoming1.age = 200
del xiaoming1.age

执行结果:
property
age.setter
age.deleter

类属性方式定义

class Good(object):

    def __init__(self):
        self.price = 100
        self.discount = 0.8

    def get_price(self):
        new_price = self.price * self.discount
        return new_price

    def set_price(self, value):
        self.price = value

    def del_price(self):
        self.price

    PRICE = property(get_price, set_price, del_price, '价格描述')

good = Good()
good.PRICE
good.PRICE = 200
del good.PRICE

樱桃小丸子
27 声望1 粉丝