构造函数的使用场景

转载:https://www.cnblogs.com/dongml/p/10921035.html

面向对象主要有三个特征:封装,继承,多态度。

一.封装

定义类语

class Animal():

class为定义类的关键字,后面跟名字():

python命名规范建议:类一般首字母单词大写,属性变量,函数首单词字母小写

定义一个类叫Animal,相关代码:
class Animal():
    ##类里定义的属性称为类属性
    count=0
    ##构造函数,实例化的时候会自动调用该函数
    def __init__(self,name,age,sex):
        ##构造函数里定义的字段称为实例属性
        self.name=name
        self.age=age
        self.sex=sex

        print('名字叫:'+self.name+',年龄'+str(self.age)+'岁,性别品种是:'+self.sex)
        print('当前动物数量:'+str(self.__class__.count))

if __name__ == '__main__':
    ##实例化Animal
    a1=Animal('狮子',2,'公')

F:\python\python.exe "I:/zhuomian/python D pan/python/day15/21/构造函数狮子和老虎.py"
名字叫:狮子,年龄2岁,性别品种是:公
当前动物数量:0

这里name,age,sex为实例属性,通过类在实例化的时候赋值,count为类属性,可通过类名.属性名的方式赋值

上面代码运行结果

里name,age,sex为实例属性,通过类在实例化的时候赋值,count为类属性,可通过类名.属性名的方式赋值

这里来改写下代码,在构造函数里加上代码:

self.__class__.count+=1
class Animal():
    ##类里定义的属性称为类属性
    count=0
    ##构造函数,实例化的时候会自动调用该函数
    def __init__(self,name,age,sex):
        ##构造函数里定义的字段称为实例属性
        self.name=name
        self.age=age
        self.sex=sex
        self.__class__.count += 1

        print('名字叫:'+self.name+',年龄'+str(self.age)+'岁,性别品种是:'+self.sex)
        print('当前动物数量:'+str(self.__class__.count))

if __name__ == '__main__':
    ##实例化Animal
    a1=Animal('狮子',2,'公')
    a2 = Animal('驴子', 6, '公')
   

运行结果:

F:\python\python.exe "I:/zhuomian/python D pan/python/day15/21/构造函数狮子老虎类名属性赋值1.py"
名字叫:狮子,年龄2岁,性别品种是:公
当前动物数量:1
名字叫:驴子,年龄6岁,性别品种是:公
当前动物数量:2

里name,age,sex为实例属性,通过类在实例化的时候赋值,count为类属性,可通过类名.属性名的方式赋值

1.1类属性和类实例属性

 这里发现类属性count字段存储的数据是全局,每次实例化对象的时候值都是在之前基础上相加,而没有被销毁。

类属性和类实例属性最大的区别就是:

类属性字段的值不会因为类的实例化而丢失,是全局保存的

类实例属性:只有每次实例化类对象赋值的时候才有值,不是全局保存的。

查看解释器里生成的雷属性代码;类名.__dict__

1.2类函数

语法: def detail_info(self):

def 后面跟函数名称,self为必须函数,这里也可能用别的名称,但为了命名统一,这里推荐用self

改写后方法:

class Animal():
    ##类里定义的属性称为类属性
    count=0
    ##构造函数,实例化的时候会自动调用该函数
    def __init__(self,name,age,sex):
        ##构造函数里定义的字段称为实例属性
        self.name=name
        self.age=age
        self.sex=sex
        self.__class__.count+=1
    #类函数
    def detail_info(self):
        print('名字叫:'+self.name+',年龄'+str(self.age)+'岁,性别品种是:'+self.sex)
        print('当前动物数量:'+str(self.__class__.count))

if __name__ == '__main__':
    ##实例化Animal
    a1=Animal('狮子',2,'公')
    a1.detail_info()
    a2 = Animal('驴子', 6, '公')
    a2.detail_info()

运行结果:

 实例化对象可直接调用

1.3,私有属性,函数

在Java和c#里私有,公有都用private,public表示,但在python里没有这两个关键字,python里在属性或者函数名加__表示私有,则只能在类的内部访问,其他地方则无法访问

将函数detail_info改为私有私有函数

class Animal():
    ##类里定义的属性称为类属性
    count=0
    ##构造函数,实例化的时候会自动调用该函数
    def __init__(self,name,age,sex):
        ##构造函数里定义的字段称为实例属性
        self.name=name
        self.age=age
        self.sex=sex
        self.__class__.count+=1
    #类函数
    def _detail_info(self):
        print('名字叫:'+self.name+',年龄'+str(self.age)+'岁,性别品种是:'+self.sex)
        print('当前动物数量:'+str(self.__class__.count))

if __name__ == '__main__':
    ##实例化Animal
    a1=Animal('狮子',2,'公')
    a1.detail_info()
    a2 = Animal('驴子', 6, '公')
    a2.detail_info()

运行结果:

发现这里提示找不到__detail_info函数,这里就表示私有函数起作用了

实例方法

    定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);

    调用:只能由实例对象调用。

类方法

    定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);

    调用:实例对象和类对象都可以调用。

静态方法

    定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;

   

二。继承

python里支持单根继承,多继承

相关语法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值