版权声明:转载请注明出处~ 摸摸博主狗头 https://blog.csdn.net/cris_zz/article/details/83628961
类和对象
# 自定义一个最简单的类:
# class 类名([父类名]):
# codes
class Student():
pass
print(Student, type(Student)) # <class '__main__.Student'> <class 'type'>
# 生成类的实例对象
stu1 = Student()
stu2 = Student()
# <__main__.Student object at 0x000002134EE4C3C8> <class '__main__.Student'>
print(stu1, type(stu1))
# <__main__.Student object at 0x000002134EE47DD8> <class '__main__.Student'>
print(stu2, type(stu2))
# 通过 isinstance 判断对象是否是某个类
print(isinstance(stu1, Student)) # True
'''
Python 中的类也是对象数据类型,用来创建对象的对象
定义类,实质上就是创建一个 type 类型的对象
可以向对象中添加变量,对象中的变量通常称之为属性:对象.变量=值
'''
print(id(Student), type(Student)) # 2429212912376 <class 'type'>
stu1.name = "cris" # 不推荐直接通过对象来添加属性
print(stu1.name) # cris
'''
类的定义
- 类和对象都是对现实生活中的事物或程序中的内容的抽象
- 实际上所有的事物都由两部分构成:
1.数据(属性)
2.行为(方法)
- 在类的代码块中,我们可以定义变量和函数,
变量会成为该类实例的公共属性,所有的该类实例都可以通过对象.属性名 的形式访问
函数会成为该类实例的公共方法,所有该类实例都可以通过对象.方法名() 的形式调用方法
- 注意:
方法调用时,第一个参数由解析器自动传递(就是self 参数,类似Java 的this),所以定义方法时,至少要定义一个形参(self)!
- 实例为什么能访问到类中的属性和方法?
类中定义的属性和方法都是公共的,任何该类实例都可以访问
- 属性和方法查找的流程
当我们调用一个对象的属性时,解析器会先在当前对象中寻找是否含有该属性,
如果有,则直接返回当前的对象的属性值,
如果没有,则去当前对象的类对象中去寻找,如果有则返回类对象的属性值,
如果类对象中依然没有,则报错!
- 类对象和实例对象中都可以保存属性(方法)
- 如果这个属性(方法)是所有的实例共享的,则应该将其保存到类对象中
- 如果这个属性(方法)是某个实例独有,则应该保存到实例对象中
- 一般情况下,属性保存到实例对象中
而方法需要保存到类对象中(和 Java 截然不同!)
'''
class Person:
# 公共属性,类似java 的静态变量,Python 中不建议在类中定义属性
name = "cris"
age = 22
# 方法调用和函数调用的区别:如果是函数调用,传递几个参数就是几个参数
# 如果是方法调用,需 对象/类 .方法名(实参),即使不传递实参,系统也会默认传递一个参数
def hello(self):
# 方法每次被调用,解析器都会默认传递第一个实参,其实就是调用方法的对象本身(id显示),通常命名为 self
# 注意! Python 类中的方法无法访问到类属性
print(f'hello,{self.name}')
print(Person.age) # 22
print(Person.name) # cris
p1 = Person()
print(p1.name) # cris
print(p1.age) # 22
p1.name = 'james'
print(p1.name) # james
del p1.name # del 关键字可用来删除对象定义的属性
print(p1.name) # cris
# Person.hello() # <function Person.hello at 0x000001A174C75840>
# <bound method Person.hello of <__main__.Person object at 0x000001A174C789E8>>
# p1.hello()
p1.hello() # hello,cris
构造方法及简单练习
class Student:
def hello(self):
print(f'hello,{self.name}')
# 不建议通过手动方式来添加对象的属性
s1 = Student()
s1.name = 'cris'
s1.hello() # hello,cris
s2 = Student()
s2.name = "james"
s2.hello() # hello,james
'''
Python中的类可以定义一些特殊方法(魔术方法),这些方法都是以__开头,__结尾,对象创建过程中解析器自动执行,不要尝试自己去调用
构造方法(__init__):通过构造方法来确保创建的对象拥有必须的属性
p1 = Person()的运行流程
1.创建一个变量
2.在内存中创建一个新对象
3.__init__(self)方法执行(每次创建新对象都会调用,self 类似Java 中的this)
4.将对象的id赋值给变量
'''
class Teacher:
# 解析器自动传递self 参数
def __init__(self, name):
self.name = name
def sayhello(self):
print(f'hello,{self.name}')
print('haha,%s' % self.name)
t1 = Teacher('cris')
print(t1.name) # cris
t1.sayhello() # hello,cris
t2 = Teacher('rose')
t2.sayhello() # hello,rose
'''
类的基本结构
class 类名([父类]) :
公共的属性...
# 对象的初始化方法
def __init__(self,...):
...
# 其他的方法
def method_1(self,...):
...
def method_2(self,...):
...
...
'''
# 定义狗并练习
class Dog(object):
def __init__(self, name: str, age: int, type: str):
super(Dog, self).__init__()
self.name = name
self.age = age
self.type = type
def eat(self):
print(f'{self.name} is eating!')
def introduce(self):
print(
f'my name is {self.name},my age is {self.age}, my type is {self.type}!')
d1 = Dog('cris', 22, '单身狗')
d2 = Dog('haha', 11, '土狗')
d3 = Dog('simida', 12, '二哈')
d1.eat() # cris is eating!
d2.introduce() # my name is haha,my age is 11, my type is 土狗!