类和对象

类:具有相同的属性和方法的对象的集合。
对象:万物皆对象 var date=new Date();date.get
类和对象的关系:
类的包含属性和方法:
语法:
class 类名:
 属性
 方法
 定义一个类:
class Person:
 def eat(self):
 print("正在吃饭...")
 def sleep(self):
 print("正在睡觉...")
创建对象:属性写在类外的情况,就是通过对象.属性,对象.方法()的方式调用
调用对象的方法:
创建多个对象:
self:
__init__(self):系统自动调用初始化方法,先生成对象,再调用此方法,再将对象赋值给引用名
 初始化操作
如果做全局属性:
例:
class Person:
 def __init__(self,v_name,v_age):
 self.name=v_name
 self.age=v_age
 def say(self):
 print("hello")
生成对象:
zhangsan=Person()
zhangsan.name="张三"
zhangsan.age=20
zhangsan.say()
__str__():
 return XXX
属性相对于类来说属于全局,每个方法都可以调用。
封装
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")
print(stu.get_name())


公有方法:
私有方法:def __test():只能在当前类中使用,以__开头
自动销毁方法:
__del__():
 XXX
当对象没有引用的时候,或程序结束的时候,程序自动调用__del__()
del 引用
可演示删除时自动调用__del__()
程序结束时自动调用__del__()
可以测试一个对象有多少个引用:
import sys
t=T()
sys.getrefcount(t)返回2
面向对象的三大特征:封装、继承、多态
继承:子类继承父类,子类可以使用父类的属性和方法,简化代码.
当生成子类对象时,先初始化父类对象,所以如果父类有__init__()方法,并且有属性时,要通过子类的构造赋值
一个类可以有多个子类
在子类中,调用父类的属性时,在__init__()方法中使用
父类.属性,或self.属性或父类.__init__(self,参数)或super(父类,self).__init__(参数)四种方法给父类传参
调用父类方法时:super().父类方法()
练习:
交通工具类:属性:名称 方法:行驶
子类:卡车,属性:载重,重写行驶的方法
子类:火车,属性:车箱个数,重写行驶的方法
总结:当子类继承父类时,子类的构造方法应该包含父类和子类共同的属性,在子类的初始化方法中,将父类的属性传递给父类,子类的属性赋值给子类
方法重写:子类继承父类时,子类的方法签名和父类一样,此时子类重写了父类的方法,当生成子类对象时,调用的是子类重写的方法


父类()
子类(父类)
三代继承:子类初始化方法需要祖父、父类及自己的属性,可以调用父类的初始化方法传参,可以重写父类的方法
构造的顺序依然先构造祖父类,再构造父类,最后构造自己
类继承object
方法重写:
如果子类重写的方法想调用父类的方法时,在子类方法中:父类.方法(self)或super().父类方法()
私有属性、私有方法:均不能在类外面被调用
多继承:类同时继承多个父类,class C(A,B),当有AB均有相同方法,而子类又重写时,调用谁的方法,如果子类没有方法,则调用哪个父类的方法?
类名.mro(),可以看到所有父类,即搜索顺序
作业:
----DVD管理系统----:
1.查询所有DVD
2.增加DVD
3.借出DVD
4.归还DVD
5.退出
多态:
类属性:属于类的成员,属于对象共有的
类方法:在方法上添加@classmethod
@classmethod
def class_method(cls):
可以通过类方法调用类属性,也可以通过对象调用类属性
静态方法:方法前加@staticmethod,静态方法没有参数,静态方法既和类没关系,也和对象没关系,也可以通过类和对象调用
工厂类:有一些子类,在一个类中生成很多对象,简单工厂模式
 pass
__new__(cls):#用来创建对象,而且必须有返回值
 return object.__new__(cls)
可以用id(cls)看地址
当有属性时,需要在__new__()中也添加属性
单例:
class singleton:
 __instance=None
 def __new__(cls):
        if cls.__instance==None:
            cls.__instance=object.__new__(cls)
            return cls.__instance
        else:
            return cls.__instance
s=singleton()
ss=singleton()
print(id(s))
print(id(ss))
对象列表进行排序:按照什么进行排序,重写__ls__方法:


class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return "姓名:%s,年龄:%d"%(self.name,self.age)
    def __lt__(self, other):
        if self.name==other.name:
            return self.age<other.age
        else:
            return self.name.encode('gbk')>other.name.encode('gbk')
支持中文排序


peple=[Person("abc",20),Person("aabc",22),Person("abc",21),Person("aabc",23)]
peple.sort()
for m in peple:
    print(m)








 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值