类中的装饰器(property classmethod staticmethod)与继承

第一部分:上节课复习

 

1.类与对象

  对象是盛放数据和功能的容器

  类存放的对象相似的数据与功能的容器

2.类和对象的使用

class student:

    n=0

    def __init__(self,name,age,gender):

        student.n+=1

        self.name=name

        self.age=age

        self.gender=gender

    def choose(self):

        pass

    

obj1=student('egon',18,'male')

obj2=student('tom',19,'male')

print(obj1.n)或者student.n

结果为:2,每调用一次类n的值就加1,总共调用了两次的类

 

 

 

二:今日内容

1.一切皆对象

一般的数据类型(int,str)都是内置的类

l1=list([1,2,3])

list.append(l1,4)

print(l1)

结果是:[1,2,3,4]

 

2.类内的装饰器

(1) property

例子1class people:

    def __init__(self,name,weight,height):

        self.name=name

        self.weight=weight

        self.height=height

    @property                                                            #作用在于p1.bmi()在调用时候可以不用括号

    def bmi(self):

        return self.weight/(self.height**2)

p1=people('ehon',65,1.73)

print(p1.bmi)

 

例子2~实现访问,修改,删除

property

class People:

    def __init__(self,name):

        self.__name=name

    @property   

    def name(self):

        return self.__name

 

    @name.setter

    def name(self,x):

        if type(x) is not str:

            raise Exception('名字必须是字符串类型')

        self.__name=x

 

    @name.deleter

    def name(self):

        print('不允许删除')

 

p1=People('egon')

print(p1.name)

p1.name='EGON'

del p1.name

print(p1.name)

结果是:

egon

不允许删除

EGON

 

3.绑定方法与非绑定方法

3.1绑定方法和非绑定方法

绑定方法:绑定给谁就有谁来调用,谁来调用就会将自己当做第一个参数传入

非绑定方法:不与类和对象绑定,意味着谁来调都可以,但无论谁来调都是一个普通的函数,没有自动传参的效果

3.2

class people:

    def __init__(self,name):

        self.name=name

#但凡在类中定义一个函数,默认就是绑定给对象的,应该由对象进行调用会将对象当做第一个参数自动传入

    def tell(self):

        print(self.name)

#类中定义的函数被classmethod装饰过,就绑定给类,应该由类进行调用类来调用会把类半身当做第一个参数自动传入

    @classmethod

    def f1(cls):  #cls=people

        print(cls)

#类中定义的函数被staticmethod装饰过,就成了一个非绑定的方法,既是一个普通的函数,都可以调用,但无论谁来调用都是一个普通的函数,没有自动传参的效果

    @staticmethod

    def f2(x,y):

        print(x,y)

p1=people('egon')

 

例子2:

import  setting

class people:

    def __init__(self,name,age,gender):

        self.name=name

        self.age=age

        self.gender=gender

 

    def tell_info(self):

        print('<%s:%s:%s' %(self.name,self.age,self.gender))

 

    @classmethod

    def from_conf(cls):

        print(cls)

        return cls(setting.NAME,setting.AGE,setting.GENDER)

 

    @staticmethod

    def create_id():

        import uuid

        return uuid.uuid1()

 

 4.面向对象---继承

4.1 继承四创建新类的一种方式,新建的类称之为子类,被继承的类称之为父类,基类,超类;类是用来解决对象之间的冗余问题的,而继承则是解决类与类之间的冗余问题的

4.2 继承的特点:子类可以遗传父类的属性

单继承与多继承  经典式与新式  强耦合型与扩展性相悖

 

5.先抽象再继承

用来查找类与类之间的关系,先找对象总结出一个类,如果有必要再总结出父类

 类中的装饰器(property classmethod staticmethod)与继承

 

 

5.单继承背景下的属性查找

查找顺序或者原则:先从对象里找,再从类中中,再从父类找

例子1:

class Bar:

    def f1(self):

        print('Bar.f1')

 

    def f2(self):

        print('Bar.f2')

        self.f1()

 

class Foo(Bar):

    def f1(self):

        print('Foo.f1')

 

obj=Foo()

obj.f2()     

#obj对象本身没有f2,故向Foo()找,但是Foo()中也没有向Foo()的父类Bar找,所以执行了print('Bar.f2')。到达self.f1()时,self.f1()=obj.f1(),也是先找obj,再找Foo

结果是:

Bar.f2

Foo.f1

上一篇:Python中classmethod和staticmethod的区别


下一篇:简述python中的@staticmethod和@property的作用及用法