类和对象
1.什么是类,什么是对象
类就是拥有相同功能和相同属性的对象的集合:类是抽象的
对象就是累的实例:对象是具体的
人是类,具体的一个人就是一个对象
车是类,具体的一辆车就是一个对象
电脑是类,具体的一台电脑就是对象
2.类的说明
类中的内容包括功能(函数)和属性(变量)
a.语法:
class 类名:
类的内容
b.说明
class - 声明类的关键字
类名 - 要求:标识符,不能是关键字
规范:驼峰式命名(通过首字母大写来区分不同的单词)--首字母要大写
: -- 固定写法
类的内容 - 包含类的方法、属性和说明文档
方法--声明在类中的函数
属性--声明在类中的属性
3.对象的声明
语法: 类名加括号 类名() -- 创建指定的类的对象
class Person:
"""
人类
"""
num=61
def eat(self):
print('在吃饭')
# 创建Pserson类的对象,p1就是对象
def main():
#
p1=Person()
p2=Person()
对象方法
class 类名:
类中的属性
类中的方法
2类中的方法:
对象方法 -- 实例方法
类方法 --
静态方法 --
2.1 对象方法
2.1.1 直接声明在类里面的方法就是对象方法
2.1.2 有默认参数self
2.1.3 通过 对象.方法() 的形式来调用,对象方法要通过对象来调用
2.2 参数self
当我们通过对象调用对象方法的时候,self不需要传参,因为系统会自动
将当前对象传递给self
当前对象---调用当前方法的对象(谁调用就指向谁)
注意,当前类的对象能做的事情self都能做,调用对象方法只需要给除了self以外的参数传参
class Person:
def run(self):
print('人在跑步')
def eat(self,food):
print(food)
def main():
p1 = Person()
p1.run()
p1.eat('包子')
init()方法
init方法:init
类中的一个特殊的对象方法,专门用来对创建的对象进行初始化
当通过类创建对象的时候,系统就会自动调用init方法
2.构造方法
构造方法就是函数名和类名是一样的叫做构造方法,专门用来创建对象
python中声明类的时候,系统会自动创建这个类对应的构造方法
当我们通过构造方法的时候内部会在内存中开辟空间保存空间,
然后用创建的对象去掉用init方法,用来对对象进行初始化。init方法调用结束后,返回对象
def Person():
对象 = 创建对象
对象.__init__()
return 对象
如果init方法里面除了self外还有其他参数,通过构造方法来给init方法传参
class Person:
# 类中两个下划线开头并且以两个下划线结尾的叫做魔法方法,不需要主动调用,系统会自动调用
def __init__(self):
print('init被调用了')
class Dog:
def __init__(self,x,y):
print(x,y)
class Jj:
def __init__(self,x,c,v,b):
print('=========')
print(x,c,v,b)
print('*********')
j1=Jj(1,2,3,4)
def main():
print('=========')
p1 = Person()
print('=========')
dog1=Dog(10,20)
对象属性
1.什么是对象属性
类中的属性分为类的字段和对象属性
对象属性:属性的值会因为对象不同而不一样,这种属性就因该声明为对象属性
声明在init方法中,以 'self.属性=值',这儿的属性就是对象属性
对象属性通过 '对象.属性' 的方式来使用 -- 使用
2.类的字段
直接声明在类的里面,函数的外面的函数就是类的字段
通过 ”类.字段“来使用
不会因为对象的不同而不同就声明成类的字段
class Person:
num = 6100000000
def __init__(self,name1='',age1=0):
self.name=name1
self.age=age1
class Dog:
def __init__(self,name,type='二哈'):
self.name=name
self.type=type
self.age=0
def eat(self,food):
print('%s在吃%s'%(self.name,food))
class Rectangle:
def __init__(self,long,width):
self.long=long
self.width=width
def area(self):
return self.long*self.width
def perime(self):
return (self.long+self.width)*2
rect1=Rectangle(20,100)
def main():
rect1 = Rectangle(20, 100)
print('面积为%s平方米'%rect1.area())# 面积为2000平方米
print('周长为%s米'%rect1.perime()) #周长为240米
print(Person.num) #6100000000
p1=Person('李四',25)
# 获取对象属性的值
print(p1.name,p1.age) # 李四 25
dog1 = Dog('李福贵')
print(dog1.name,dog1.age,dog1.type) #李福贵 0 二哈
dog1.eat('粑粑') # def eat(self,food):
#print('%s在吃%s'%(self.name,food))李福贵在吃粑粑
对象属性的增删改
python中对象的属性支持增删改查
!!!注意:对象属性操作只针对当前操作的对象
slots -->约束当前类的对象最多只能拥有的属性
1.查
a.对象.属性 -- 当属性不存在会报错
b.getattr(对象,属性名:str) --
当属性不存在的时候,如果给默认值赋值了,程序不会报错,并且将默认值作为结果。
当属性不确定的时候,可以通过getattr来获取指定属性
class Dog:
__slots__ =('name','color','age','sex')
def __init__(self,name,color,age):
self.name=name
self.color=color
self.age=age
# 属性的增删改查
class Persom:
def __init__(self,name,age=0,sex='女'):
self.name=name
self.age=age
self.sex=sex
def main():
p1=Persom('小花')
p2=Persom('二狗子')
print('=====================查找======================')
print(p1.name)
print(getattr(p1,'name',None))
print(getattr(p1,'name1',None))
2.增/改
a.对象.属性 = 值 -- 当属性存在的时候修改属性的值,不存在的时候添加属性
b.setattr(对象,属性名,值)-- 当属性存在的时候修改属性的值,不存在的时候添加属性
print('====================修改=======================')
p1.name='xiaohua'
print(p1.name)
p1.height=180
print(p1.height)
setattr(p1,'age',20)
print(p1.age)
setattr(p1,'weight',140)
print(p1.weight)
3.删
a.del 对象.属性
b.delattr(对象,属性名)
print('===============shan删==================')
del p1.sex
delattr(p1,'age')
类的内置属性
内置属性是我们创建类的时候系统自动给我们添加的属性
1. 类.name -->获取类的名字,返回值是一个字符串
2. 对象.class --> 获取对象的类
3. 类.doc --> 获取类的说明文档
4. 对象.dict -->将对象转换成字典,将属性和对应的值作为字典的键值对
5. 类.module -->获取当前类当前所在的模块名
6. 类.bases --> 获取当前类的父类
class Person:
"""
r人类
"""
num = 61
# __slots__ = ('name','age','sex')
def __init__(self,name='',age=0,sex='男'):
self.name=name
self.age=age
self.sex=sex
# 当我们通过print打印一个对象的时候,实质就是打印对象调用__repr__函数的返回值
# 这个函数返回值必须是字符串
def __repr__(self):
return str(self.__dict__)[1:-1]
def eat(self,food):
print('%s在吃%s'%(self.name,food))
class Dog():
def __init__(self,name,age,type):
self.name=name
self.age=age
self.type=type
def __repr__(self):
return str(self.__dict__)[1:-1]
dog1=Dog('李福贵',1,'花尾巴狗')
dog2=Dog('1',2,'3')
print(dog1,dog2)
def main():
""""""
p1=Person('小明',18)
print(p1)
"""
1 . 类.__name__ -->获取类的名字,返回值是一个字符串
"""
print(Person.__name__,type(Person.__name__)) # Person <class 'str'>
"""
2. 对象.__class__ --> 获取对象的类
"""
my_class=p1.__class__
print(my_class)
p2= my_class('小花')
print(my_class.num)
"""
3.类.__doc__ --> 获取类的说明文档
"""
print(Person.__doc__) # r人类
print(p1.__class__.__doc__) # 获取对像p1的类的说明文档
"""
4.对象.__dict__ -->将对象转换成字典,将属性和对应的值作为字典的键值对
注意:当给__sots__属性赋值后,对象的__dict__属性就不能使用
"""
print(p1.__dict__) #{'name': '小明', 'age': 18, 'sex': '男'}
'''
5. 类.__module__ -->获取当前类当前所在的模块名
'''
print(Person.__module__) # __main__ 当前模块正在执行,模块名默认是__main__
'''
6.类.__bases__ --> 获取当前类的父类
'''
print(Person.__bases__) # (<class 'object'>,)
类方法和静态方法
1.对象方法
a.怎么申明: 直接声明
b.特点: 自带一个self参数的函数
c.调用: 通过对象调用 对象.方法()
2.类方法
a.声明:声明函数前面加@classmethod
b.特点:自带cls参数的函数 --调用的时候不用传参,系统会自动调用当前函数的类传给它
类方法只能通过类来调用
类能做的事情,cls都能做
c.调用:类.方法()
3.静态方法
a.声明:声明函数前加@staticmethod
b.特点:没有默认参数
c.调用:通过类来调用, 类.方法()
4.在类中怎么选择使用哪种方法
如果类中的函数的功能需要使用对象的属性,这个函数就要声明成对象方法
如果实现函数功能不需要对象的属性的时候,如果需要类的字段就声明成类方法
实现函数的功能既不需要对象属性,也不需要类的字段就声明成静态方法
class Person:
num=1
@staticmethod
def func3():
print('我是静态方法')
@classmethod
def func2(cls):
print('我是类方法2')
@classmethod
def func(cls):
p1 = cls()
print('类方法')
print(p1)
print(cls.num)
cls.func2()
def main():
Person.func()