Python--第八课(类和对象)

一、概念

:具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.

对象:万物皆对象

关系

类包含属性和方法

类是对像的模板

对象是类的事例

二、语法

class 类名:

属性

对象属性-->私有  共有

类属性-->私有  共有

方法

<1>公有方法

<2>私有方法

<3>属性方法

<4>静态方法

三、创建对象

创建对象:属性写在类外的情况,通过对象.属性,对象.方法()的方式调用 

<1>无参函数的调用(需要每个去赋值,比较啰嗦)

例:

 
class Person:
    #属性   方法
    '''
    def声明方法的标识
    eat 函数名 方法名
    () 形参列表 形参:形式列表 (定义概念)
    self 第一个参数 默认是当前对象的引用=地址指向
    '''
    def eat(self):
        print('人在方法')
    def sleep(self):
        print('吃完睡觉')
if '__main__'.__eq__(__name__):
    zhangsan=Person()
    zhangsan.eat()
    zhangsan.sleep()

执行命令得

 
人在方法
吃完睡觉

初始化:

<2>__init__(self):系统自动调用初始化方法,先生成对像,再调用此方法,再将对象赋值给引用名

用法:

def __int__(self,v_name,v_age):

    self.name=v_name

    self.age=v_age

有参函数的调用(可以直接全部赋值,比较简洁)

例:

 
class Person:
    '''
    带参-函数
    '''
    def __init__(self,name,age):
        self.name=name
        self.age=age
        print('__init__ Person')
    def eat(self):
        print(self.name+'在吃饭')
    def sleep(self):
        print(self.name+'吃完睡觉')
    def hello(self):
        print('大家好,我是'+self.name+'  今年',self.age)
if '__main__'.__eq__(__name__):
    zhangsan=Person('张三',19)#直接赋值参数
    zhangsan.eat()
    zhangsan.sleep()
    zhangsan.hello()

执行命令得

 
__init__ Person
张三在吃饭
张三吃完睡觉
大家好,我是张三  今年 19

<3>重写;当需求系统自带不能满足时需要用到重写,即自己编写的规则

__str__():

    return  xxx

 
class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        #object 所有数据类型的基类 父类
        return 'name:'+self.name+'age:'+str(self.age)
if '__main__'.__eq__(__name__):
    zhangsan=Person('张三',19)
    print(zhangsan)
    print(str(zhangsan))#对上面未声明__str__函数时输出结果与 id相同
    print(zhangsan.__str__())
    print(id(zhangsan))

执行命令得

 
name:张三age:19
name:张三age:19
name:张三age:19
90743856

<4>属性相对于类来说属于全局 即:每个方法都可以调用

get/set方法:不写__init__()方法

set_name(self,new_name):

    self.name=new_name

get_name(self);

    return self.name

解释性语言:不需要预定义  随时创建随时使用

 
class Student:
    def set_name(self,name):
        self.name=name
    def get_name(self):
        return self.name
stu=Student()
stu.set_name("abc")#边执行边解释 或者写成 stu.name='abc'
print(stu.get_name())

执行命令得

 
abc

 封装

 
class Person:
    def setage(self,new_age):
        '''
        封装的意义  doc 注释==>文档注释
        :param new_age: 新的年龄 0--100
        :return: None
        '''
        if new_age<0 or new_age>100:
            print('超出年龄限制 默认18')
            self.__age__=18
        else:
            self.__age__=new_age
if '__main__'.__eq__(__name__):
    zhangsan=Person()
    zhangsan.setage(1000)
    print('age:',zhangsan.__age__)

执行命令得

 
超出年龄限制 默认18
age: 18

四、

<1>公有方法;从外部直接调取的都是公有

私有方法:只能在内部调用,外部不允许访问(可以调用不是绝对的,一切靠自觉)

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

<2>自动销毁方法:

1.__del__():

 xxx

当独想没有引用的时候,或程序结束的时候,程序自动调用__del__()

2.del 引用  科颜氏删除时自动调用__del__()

3.程序结束时自动调用__del__()

 
class Person:
    def __show__(self):
        print('哈哈')
    def __del__(self):#自动删除
        print('对象被删除..资源被释放')
if '__main__'.__eq__(__name__):
    zhangsan=Person()
    zhangsan.__show__()
    lisi=zhangsan
    del zhangsan#手动删除
    for i in range(5):
        print(i)

执行命令得

 
哈哈
0
1
2
3
4
对象被删除..资源被释放

<3>测试一个对象有多少个引用(有多少引用指向同一块空间)

import sys#导入

t=T()#引用

sys.getrefcount(t)返回 从2开始  #ref 引用传递

 
import sys
class Person:
    def __show__(self):
        print('哈哈')
if '__main__'.__eq__(__name__):
    zhangsan=Person()
    zhangsan.__show__()
    lisi=zhangsan
    print(sys.getrefcount(zhangsan))

执行命令得

 
哈哈
3

五、Python变量的命名规则  数字 /字母/ _ 

首字母不能是数字开头

非硬性要求规范:首字母小写 其余首字母大写

不能使用关键字

一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照规定俗称的规定,当你看到这样的变量时,意思就是"虽然我可以被访问,但是,请把我视为私有变量,不要随意访问".

双下划綫开头的实例变量是不是一定不能在外部访问呢?

其实也不是.不能直接访问__name是

 
class Person:
    def  __init__(self,name):
        self.__name=name
if '__main__'.__eq__(__name__):
    zhangsan=Person('张三')
    print(zhangsan._Person__name)

执行命令得

 
张三

因为Python解释器对外把__name变量改成了_类名__name.所以仍然可以通过_类名__name来访问__name变量:

对一个对象的引用调用id()函数,可以得到该对象的标识符(dentity).该标识符是一个整数,它保证在该对象的生命周期内是唯一的和恒定的.具有不重叠生命周期的两个对象具有不同的id()值.

猜你喜欢

转载自blog.csdn.net/VanChaoi/article/details/80268513