defineClass
- 什么是类、对象
1)官方定义
类就是拥有相同功能和相同属性的对象的集合 - 抽象的
对象就是类的实例 - 具体的
2)生活角度看类和对象
如果人是类,余婷就是对象,骆昊也是对象
如果电脑是类,我桌子上的这台电脑就是电脑的一个对象
- 类的声明
1)语法
class 类名:
类的内容
2)说明:
class - 声明类的关键字
类名 - 标识符,不能是关键字,见名知义,采用驼峰式命名(采用通过单词首字母大写方式来区分不同的单词),首字母也要大写
: - 固定写法
类的内容 - 主要包含:类的说明文档、属性(普通变量)、功能(函数/方法)
对象怎么声明
对象 = 类名() - 创建指定的类对应的对象类中的方法
1)什么是方法:声明在类中的函数就叫方法
2)类中的方法有三种:对象方法,类方法,静态方法
a. 对象方法:直接声明在类中的函数,有默认参数self,通过对象调用的时候这个参数不用传参,因为系统会自动将当前对象传递给self(self,当前对象 - 谁调用,self就指向谁,当前类的对象能做的事情self都能做)
通过类的对象来调用:对象.对象方法()
b. 类方法:声明函数前加@classmethod,有默认参数cls,通过类调用的时候这个参数不用传参,因为系统会自动将当前类传递给cls
(cls,当前类 - 谁调用就指向谁,当前类能做的事情cls都能做);通过类来调用:类.类方法()
c. 静态方法:声明函数前加@staticmethod,没有默认参数,通过类来调用:类.静态方法()
# 声明一个person类
class Person:
"""人类"""
#===========属性==========
#===========方法==========
#===========对象方法======
def eat(self, food):
print('人吃' + food)
def student(self, study):
print('学习')
#=========类方法===========
@classmethod
def destroy(cls):
print('人类破坏环境')
@staticmethod
def beat_animal():
print('人类殴打小动物')
# 创建person类的对象p1
p1 = Person()
print(p1)
p2 = Person()
p1.eat('烤肉')
# 类调用类方法
Person.destroy()
Person.beat_animal()
init
- 什么是init方法
init是类默认继承的一个魔法方法,用来初始化类;本质是对象方法,但是不需要程序员自己调用,会被自动调用
通过类创建对象的时候(通过构造方法创建对象),系统会自动调用类中的init方法,并且构造方法中的实参会全部传给init方法
创建对象的时候需不需要参数,需要几个参数,看这个类的init方法
(了解)声明类的时候系统会自动给我们创建一个函数,这个函数的函数名和声明的类的类名一样,这个函数叫构造方法
函数会先先在内存中开辟空间创建对象,然后用创建的对象去调用类的init方法,最后再将对象返回
class Person:
def __init__(self, name, age):
print(self, name)
print('init方法')
p1 = Person('余婷', 18)
p2 = Person('小明', 20)
# ===========模拟构造方法和init的关系============
def yt_init(name, age):
print('自己的init', name, age)
def yt_Person(*args, **kwargs):
yt_init(*args, **kwargs)
yt_Person('小明', 20)
yt_Person(name='张三', age = 20)
yt_Person(name = '小鹏', age = 43)
property
- 属性
类中的属性分为:对象属性和字段
1)字段:声明在类中的变量就是字段;字段要通过'类.字段'的方式来使用;当属性的值不会因为对象不同而不同,这种属性就可以声明成类的字段
2)对象属性:在init方法中,以'self.属性 = 值'的形式声明;对象属性通过‘对象.属性’的方式来使用,;当属性的值会因为对象
不同而不同的时候,使用对象属性
class Dog:
#=========字段======
numbers = 10
#======对象属性=====
def __init__(self, name1='', color1='黄色', gender1='公狗', age1=0):
self.name = name1
self.color = color1
self.gender = gender1
self.age = age1
# 使用字段属性
Dog.numbers = 100
print(Dog.numbers)
# 使用对象属性
dog1 = Dog()
print(dog1.color)
print(dog1.gender)
print(dog1.age)
dog2 = Dog('葫芦', color1='黑色', gender1='母狗')
print(dog2.name)
print(dog2.color)
print(dog2.gender)
print(dog2.age)
# 练习:声明一个学生类,拥有属性:名字、电话、年龄、学号 拥有功能:学习(打印XXX在学XXX)
class Student:
number = 100
def study(self, subject: str):
print(Student.number)
print('%s在学%s' % (self.name, subject))
def __init__(self, name1, tel1, age1, num1):
self.name = name1
self.tel = tel1
self.age = age1
self.num = num1
stu1 = Student('hulu', '123', 19, '990')
print(stu1.name)
stu1.study('英语')
class Retangle:
"""矩形"""
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
return self.length * self.width
def perimeter(self):
return 2 * (self.length + self.width)
ret = Retangle(10, 5)
print(ret.area())
print(ret.perimeter())
- 声明类的时候方法的选择(记住)
1)对象方法:实现函数的功能需要对象属性的时候就使用对象方法- 类方法:实现函数的功能不需要对象属性,但是需要类的相关操作的时候就使用类方法
3)静态方法:实现函数的功能既不需要对象属性也不需要类相关的操作就使用静态方法
- 类方法:实现函数的功能不需要对象属性,但是需要类的相关操作的时候就使用类方法
properyOperation
Python中的对象属性支持增删改查
class Dog:
def __init__(self, name):
self.name = name
self.age = 0
dog1 = Dog('大黄')
dog1 = Dog('财财')
# 1.查
"""
a.对象.属性 - 获取制定对象指定属性对应的值,如果属性不存在会报错
b.getattr(对象,属性名, 默认值) - 获取制定对象指定属性对应的值,当属性不存在有默认值的时候不会报错,返回默认值;
没有默认值的时候报错
"""
print(dog1.name)
# print(dog1.name2) AttributeError: 'Dog' object has no attribute 'name2'
print(getattr(dog1, 'name2', 100))
# 2.增、改
"""
a.对象.属性 = 值 - 当属性不存在就添加属性,当属性存在就修改属性的值
b.setattr(对象,属性名,值) - 当属性不存在就添加属性,当属性存在就修改属性的值
"""
dog1.gender = '雌'
print(dog1.gender)
dog1.name = '贝贝'
print(dog1.name)
a_name = 'color'
setattr(dog1, a_name, '白色')
print(dog1.color)
setattr(dog1, 'name', '京京')
print(dog1.name)
# 3.删
"""
a.del 对象.属性
b.delattr(对象,属性)
"""
# del dog1.name
# print(dog1.name) AttributeError: 'Dog' object has no attribute 'name'
# delattr(dog1, 'age')
# print(dog1.age) AttributeError: 'Dog' object has no attribute 'age'
# 注意:对象属性的增删改查只针对单个对象