Cris 的Python笔记(八):Python 的面向对象基础

版权声明:转载请注明出处~ 摸摸博主狗头 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 土狗!

猜你喜欢

转载自blog.csdn.net/cris_zz/article/details/83628961