类 ————一段内存地址空间
变量(对象)———— 内存地址的引用
对象调用类:[对象名=类名()]
不同的对象调用类时,类为对象开辟不同的内存地址空间。类中存在self内置参数,调用类时,才会传递参数,self将这段内存地址空间引用
哪个对象调用类中的方法 那self就指向哪个对象的引用(内存地址空间)
对象在调用类时,self参数会自动传递,不用手动传递。
新式类(继承object类) 旧式类又叫经典类 不以objiect为基类 代码规范: 对定义的类都继承object eg: class Dog(object)
类的复用 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()
__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))
__ 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 走了
在对象的方法内部(即对象调用类方法的内部)是可以直接访问对象(对象本身)的属性
(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
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的值才发生改变。
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
class Cat(object):
@staticmethod
def call():
print('喵喵')
Cat.call()
##运行结果:
喵喵
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())