python基础知识Day05

1. 对象

1.1 多态

多态意味着就算不知道变量所引用的对象类型是什么,还是能对它进行操作,而它也会根据对象类型的不同表现出不同的行为。

class food:
    def getprice(self):
        print("this is food's price")

class drunk(food):
    def getprice(self):
        print("this is drunk's price")

class rice(food):
    def getprice(self):
        print("this is rice's price")

def fun(object):
    object.getprice()

if __name__=="__main__":
    D=drunk()
    R=rice()
    fun(D)
    fun(R)

从上面代码可以发现,多态可以提高代码的复用性,即无论子类的函数getprice()中是怎么的函数,我只需要调用它即可,很大程度上增加了灵活性。

1.2 封装

封装是指向程序中的其他部分隐藏对象的具体实现细节,与多态不同,多态是可以让用户不知道是什么类的对象进行方法调用,而封装是可以不用关心对象是如何构建的而直接进行使用。

class person:
    def __init__(self,name,habbit,hometown):
        self.name=name
        self.habbit=habbit
        self.hometown=hometown

def habbit(self):
        print('%s 的爱好是 %s' %(self.name,self.habbit))

def hometown(self):
        print('%s的家乡是 %s' %(self.name,self.hometown))

xiaoming=person('小明', '唱歌', '四川')
habbit(xiaoming)
hometown(xiaoming)


xiaozhang=person('小张', '跳舞', '上海')
habbit(xiaozhang)
hometown(xiaozhang)

从person类中我们把各类数据定义好了,就没有必要从外面的函数去访问,我们可以直接在person类的内部定义访问数据的函数。这样,就把数据给“封装”起来了。
“封装”就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体(即类);封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。

1.3 继承

继承是另一个懒惰的行为。定义一个 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类(Subclass),而被继承的 class 称为基类、父类或超类(Base class、Super class)

python继承中的特点:

  1. 在继承中,基类的构造方法(init()方法)不会自动调用,需要在子类的构造方法中专门调用。
  2. 在调用基类的方法时需要加上基类的类名前缀,并带上 self 参数变量。区别于在类中调用普通函数时不需要带 self 参数。
  3. 在 Python 中,首先查找对应类型的方法,如果在子类中找不到对应的方法,才到基类中逐个查找。
class people:
    # 定义基本属性
    name = ''
    age = 0
    # 定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    # 定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    
    def speak(self):
        print("%s 说:我  %d 岁了"%(self.name,self.age))
        
        
# 单继承
class student (people):
    grade = ''
    def __init__(self,n,a,w,g):
        # 调用父类的构造
        people.__init__(self, n, a, w)
        self.grade = g 
        
    # 覆写父类法人方法
    def speak(self):
        print("%s 说:我  %d 岁了,在读 %d 年级"%(self.name,self.age,self.grade))
        
zth = student('zth',10,40,5)
zth.speak()

2. 类和类型

可以将类看作种类的同义词。所有的对象都属于某一种类,称为类的实例。例如:鸟类是百灵鸟类的父类,百灵鸟类是鸟类的子类。

class person:
    def setName(self,name):
        self.name=name
    def getName(self,name):
        return self.name
    def greet(self):
        print( 'hello,i am %s.' % self.name)

foo=person()
bar=person()
foo.setName('nancy')
bar.setName('jason')
foo.greet()
bar.greet()

self的作用:
1.self作为参数,是方法和函数的区别。首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
2.在调用foo的greet和setName函数时,foo自动将自己作为第一个参数传入函数中,因此命名为self。foo.greet()看作Person.greet(foo)

当然也可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数了。

class Class:
    def method(self):
        print('im a self')

def function():
    print("i don't...")

instance=Class()
instance.method()
instance.method = function #将特性绑定到了一个普通函数上
instance.method()


>>>im a self
i don't...

2.1 再论私有化

1.类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs

2.类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。

#问女性的姓名、工作是没有问题的,但是问女性的年龄、体重是不礼貌的,所以我们把女性年龄定义为私有属性
#定义显示女性的姓名、工作为公有方法,显示女性年龄、体重为私有方法
#类的定义部分
class Woman():
    name = "Juckes"  #类的公有属性
    job = "Teacher" 
    __ages = 30      #类的私有属性
    __weight = 60

    def disp_nj_info(self):  #类的(公有)方法
        print("Name:{}, Job:{}".format(self.name,self.job)) #类的内部调用公有属性

    def __disp_aw_info(self):  #类的私有方法
        print("Age:{}, Weight:{}".format(self.__ages, self.__weight))  #类的内部调用私有属性

    def dis_all_info(self):
        self.disp_nj_info() #类的内部调用公有方法
        self.__disp_aw_info() #类的内部调用私有方法

2.2 指定超类

class Filter:
    def init(self):
        self.blocked=[]

    def filter(self,sequence):
        return [x for x in sequence if x not in self.blocked]

class SPAMFilter(Filter):
    def init(self):
        self.blocked=['SPAM']

f=Filter()
f.init()
f.filter([1,2,3])

s=SPAMFilter()
s.init()
s.filter(['SPAM','SPAM','apple'])
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值