python中的面向对象

1. python面向对象中的类与对象

  • 类 ————一段内存地址空间

  • 变量(对象)———— 内存地址的引用

  • 对象调用类:[对象名=类名()]
    不同的对象调用类时,类为对象开辟不同的内存地址空间。类中存在self内置参数,调用类时,才会传递参数,self将这段内存地址空间引用
    哪个对象调用类中的方法 那self就指向哪个对象的引用(内存地址空间)
    对象在调用类时,self参数会自动传递,不用手动传递。

  • 新式类(继承object类) 旧式类又叫经典类 不以objiect为基类 代码规范: 对定义的类都继承object eg: class Dog(object)

类的复用 self也是变量 其引用的就是创建出来的那段内存地址空间

2.python中的面向对象内置初始方法

内置初始方法:对象在调用类时,会自动调用内置初始方法

2.1 内置初始化方法之一__init__(self)

__init__是专门用来定义一个类据有哪些属性和方法的内置方法;调用初始化方法为对象的属性设置初始值

  • 一个栗子
class Cat: ##封装一个猫类
    def __init__(self,new_name): # 属性定义初始化方法  创建对象时就会被调用
        print('这是一个初始化方法')
        self.name = new_name  ##属性的定义
    def eat(self): ## 方法
        print('%s 爱吃鱼' %(self.name))
        #pass
    def drink(self):
        print('猫要喝水')

Tom=Cat("tom")
print(Tom.name)
Tom.eat()

在这里插入图片描述

2.2 内置初始化方法之二 __str __(self)

__str __:在python中 使用print输出对象变量时候,默认情况下
会输出这个变量引用的对象是由哪一个类创建的对象以及在内存中的地址。如果在开发中,希望使用print输出变量的时候,能够打印自定义内容,就可以利用__str__这个内置的方法了
该方法必须返回字符串类型

  • 一个栗子:
class Cat:
    def __init__(self,name):
        self.name = name
    def __str__(self):
        # 返回必须是一个字符串
        return '我是 %s' %(self.name)
tom = Cat('tom')
print(tom.name)
print(tom)

addr = id(tom)
print(addr)
# 十六进制
print('%x' %(addr))
# 十进制
print('%d' %(addr))

在这里插入图片描述
在这里插入图片描述

2.3 内置方法之三:__del __(self)

__ del__:如果希望在对象被销毁之前,再做一些事情,可以考虑一下__ del__;当一个对象被从内存中销毁前(把这个对象从内存中删除掉),会自动调用 __ del__方法。当出现del 关键字将对象删除时,内存地址空间将被收回,自动调用__del__

  • 一个栗子:
class Cat:
    def __init__(self,name):
        self.name = name
        print('%s 来了' %(self.name))
    def  __del__(self):
        print('%s 走了' %(self.name))
tom = Cat('tom')
print(tom.name)
# del tom
print('*' * 50)
print(tom.name)

运行结果:

tom 来了
tom
**************************************************
tom
tom 走了

3. 属性的定义

在对象的方法内部(即对象调用类方法的内部)是可以直接访问对象(对象本身)的属性

(1)定义方法一

def __ init__(self,new_name)  ##内置初始化方法之一 对象调用时,自动被调用
    self.name=new_name

(2)定义方法二: 属性可以在类外部定义

 class Cat:
   def eat(self):
        print('%s 爱吃鱼' %(self.name))
    def drink(self):
        print('猫要喝水')

hellokitty = Cat()
hellokitty.name = 'HK'
print(hellokitty.name)


运行结果:
HK

4.类属性、类方法与静态类

4.1 类属性
属于类内部使用的属性 使用赋值语句在class 下定义的。 类属性是定义声明在类中的一种属性,不同于成员属性。类属性是所有实例化对象共同的属性,并且可以直接使用类调用使用。定义:“类名.属性名称”
  • 一个栗子:
class Person:
 
    num=20
    def __init__(self,name,age,gender,address):
        self.name=name   
        self.age=age
        self.gender=gender
        self.address=address
 
tom=Person('tom',23,'男','美国')
jerry=Person('jerry',22,'男','美国')
print(tom.num,jerry.num,Person.num)
 
tom.num=30
print(tom.num,jerry.num,Person.num)
 
Person.num=40
print(tom.num,jerry.num,Person.num)
 
 
#输出结果
20 20 20
30 20 20
30 40 40

在上面,我们在类Person中,声明了一个没有带self 的变量num。在实例化的两个对象tom,jerry中都能使用,甚至我们还可以直接使用类去调用这个变量/属性,这时的num就是类Person的类属性/变量。

并且,我们还过修改num的值可以看出,当使用对象去改变num的值时,此时的num变成了tom对象中的实例变量/属性了,而通过类调用改变num的值,此时的num的值才发生改变。

4.2 类方法
使用装饰器@classmethod 针对类对象定义的方法 ;必须至少有一个参数,且第一个参数留给了cls,cls指代调用者即类对象自身;cls可以直接操作类的属性; cls这个标识符可以是任意合法名称,但是为了易读,请不要修改
  • 一个栗子:
class Toy(object):
    # 使用赋值语句定义类属性 记录所有的玩具数量
    count = 0
    def __init__(self,name):
        self.name = name
        # 让类属性+1

    @classmethod
    def show_toy_count(cls):
        print('玩具对象的数量 %d' %(cls.count))
 # 创建玩具对象
toy1 = Toy('乐高')
toy1
toy2 = Toy('泰迪熊')
toy3=Toy('汤姆猫')
print(Toy.count)
Toy.show_toy_count()


##运行结果:
3
玩具对象的数量 3

4.3 静态类
使用装饰器@staticmethod def call() 无self参数 通过“类名.方法名”调用 不需要创建对象 直接可以调用
  • 一个栗子:
class Cat(object):
    @staticmethod
    def call():
        print('喵喵')
Cat.call()


 ##运行结果:
 喵喵

5.私有属性与私有方法

5.1 私有属性
self.__xxx属性前带两个下划线 表示对变量进行私有化;外部不能随便的访问及更改,访问不到;只能通过调用方法使用
5.2 私有方法
类中方法名前带两个下划线 __ 的方法称为私有方法,不会被外部访问到
  • 一个栗子:

class Student(object):
def init(self, name, score):
# 前面带两个下划线表示对变量进行私有化
# 外部不能随便访问和更改
self.__name = name
self.__score = score
def get_grand(self):
print(‘my name is %s,my’
‘grand is %d’ % (self.__name, self.__score))

def __get_name(self):
    return self.__name

def get_score(self):
    return self.__score

def set_name(self, name):
    if isinstance(name, str):
        self.__name = name
    else:
        raise ValueError('请输入正确的名字')

def set_score(self, score):
    if isinstance(score, int):
        self.__score = score
    else:
        raise ValueError('请输入正确的成绩')
        tom = Student('Tom', 89)
print(tom.name)
print(tom.score)
print(tom.__get_name())
print(tom.get_score())

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值