Python类

1.定义类、对象的方法、__init__方法

#1.类的定义:Python中,类使用class关键字创建。类的属性和方法都被列在一个缩进块中,
#创建一个类的方法如下;
class person :#创建person类
    print('这是一个类:person')  #创建person类的行为(方法),以此类建立的对象都会执行print('这是一个类:person')这个行为
p = person() #创建的一个对象,具有输出‘这是一个类:person’的行为
print(p)

# 2.对象(实例)方法的定义:
#类可以拥有像函数一样的方法,这些方法与函数是作为类生成的对象拥有的行为来使用的。
#注意,实例方法的第一个参数必须是self,且必须包含一个self参数。
# 使用对象的方法如下:
class person:
    name='小明' #类变量,类的属性,默认person类的name属性为小明
    def sayHi(self):#定义的一个sayHi函数,其输入参数self,指类实例本身(即P)
        print("hello,how are you?")
        print('我的名字叫'+self.name)
p=person()#创建类为person的对象
p.sayHi()#对P对象进行sayHi操作

# 3.__init__方法在类的一个对象被建立时,马上运行这个方法可以用来对对象做一些我们希望的初始化。
# 注意,这个名称的开始和结尾都是双下划线。__init__方法的第一参数是self
#注意,__init__方法必须包含一个self参数,且必须是第一个参数。
class person:
    def __init__(self,name): #self指类实例P,name是需要传入的参数
        self.name=name   #类实例的属性=name(传入的参数)
    def sayHi(self):  #定义的一个sayHi操作,self还是指类实例
        print('hello,我的名字是',self.name)
p=person('小红')
p.sayHi()

2.类的封装和继承

#类的封装:定义私有属性,只能在类内部访问,不能在主程序中访问,通过'__'实现
class Student:
    def __init__(self,name,num,sex):
        self.__name=name#此时name为私有属性,只能在内部被访问
        self.num=num
        self.sex=sex
    def introduce(self):
        print('姓名:',self.name,
              '学号:',self.num,
              '性别:',self.sex)
    def get_name(self):
        return self.__name

stud1=Student('小红','A01','女')
#print(stud1.name)#AttributeError: 'Student' object has no attribute 'name'
print(stud1.get_name())#通过在类内部再建立一个方法来实现对私有属性的调用

#类的继承
import turtle as t
class Star():
    def __init__(self):
        self.size=200
    def draw(self):
        for i in range(5):
            t.forward(self.size)
            t.left(144)


class Big_star(Star): #定义一个类Big_star,Bif_star继承Star类的draw方法
    def __init__(self):
        self.size=500
s=Star()
s.draw()

bs=Big_star()
bs.draw()

del_(self)
当实例要被销毁的时候,会调用对象的__del__()方法。注意当使用del a这样的语句时,并不会调用__del__()方法,只是减少一个引用计数,当对象的引用计数减至0时,才会调用__del__()。

3.类中的self为什么传的是实例

1、如果类没有定义__new__方法,就从父类继承这个__new__方法。
2、__new__先于__init__执行,类带括号调用时,发生这样的一件事,先调用类的__new__方法,返回该类的实例对象,这个实例对象就是__init__方法的第一个参数self。
3、__new__需要带返回值,不带返回值则__init__方法就没被调用。
4、__init__和__new__在python官方文档中的介绍:python官方文档,__init__和__new__介绍
5、关于python中的新式类和经典类:
1)只有在python2中才分新式类和经典类,python3中统一都是新式类
2)在python2中 没有显示继承的object类的类,以及该类的子类都是经典类
3)在python2中,显示的声明继承object的类,以及该类的子类都是新式类
4)在python3中,无论是否继承object,都默认 继承object,即python3中所有类均为新式类
5)如果没有指定基类, python的类会默认继承object类, object是所有python类的基类。

class Foo():
    def __init__(self):
        print("__init__中self的内存地址:",id(self))
f = Foo()
print("实例f的内存地址:",id(f))
#__init__中self的内存地址: 2553975174144
# 实例f的内存地址: 2553975174144
#两者的内存地址相同,说明是一样的,类中的self默认传的是实例对象

class Foo(object):
    def __new__(cls, *args, **kwargs):
        """如果不覆盖这个__new__方法,也就是说不写这个__new__方法,类会从object
        继承__new__方法完成返回值实例对象
        """
        print("__new__方法先被调用")
        tmp = super(Foo, cls).__new__(cls, *args, **kwargs)
        print(id(tmp))
        print(type(tmp))
        print(isinstance(tmp, Foo))
        print(issubclass(type(tmp), Foo))
        return(tmp)

    def __init__(self):
        """self是python默认传的值,该值是调用__new__的返回值"""
        print("__init__被调用")
        print(id(self))

p = Foo()
print(id(p))
print(type(p))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值